如何读取 JSON 里嵌套的深层数据?我这儿有各语言通用方案

前言

使用JSON格式进行多个端特别是先后端之间通讯已成为主流方案之一, PHP、java、objectC、JavaScript 这几种语言是我所在团队接触比较多的主要开发语言。php

有一个问题

有时候,不少时候,从接口给出的数据会存在数据嵌套现象,好比在一款记帐软件中,一条付款计划的数据会同时携带计划所在合同的数据,而合同数据里又会携带合同对应客户的数据。html

咱们固然能够经过逐层取值的传统方式,去取出最终的值。java

然而,有一个问题,许多时候,这些数据并不必定老是存在,好比有些合同数据并无签定客户的存在,这时候你若是不在代码里作 null 值的判断,应用进程也许就直接崩了。android

此处只讨论存在多重嵌套的数据提取问题,若是你的项目里约定禁止数据嵌套,那就是另外一件事了。ios

须要一个通用的解决方案

这个问题,在各开发语言里都会存在,因此咱们团队在讨论以后,决定一块儿作一个通用的方案来解决。git

笨办法

核心思路很简单,咱们提出了 path (路径)的概念,好比上文中提到的从付款计划里取合同客户名称的状况,若是用路径来定位,用 > 做为分隔符,这个客户名称的定位路径就是 results>pactUUIDLocal>customerUUIDLocal>namegithub

那么,咱们只要封装出一个根据路径取值的通用方法来,取值时,只管调用方法去取各路径的值,若是不存在值就返回 null,这个问题不就解决了嘛。web

是的,本文的核心思路就是如此。json

数组怎么办

将数组当作key为下标的字典,便可。后端

HaoResult .php .m .java .js

通过不断调整,咱们定义了一个 HaoResult 类,用来实例化 json 对象,并实现了 HaoResult.find(path) 这个核心方法。

各语言实现方式的代码以下, 供参考,分别来自 HaoConnectHaoAdmin

HaoResult.php

HaoResult.m

HaoResult.java

haoresult.js

其实,在各语言里都存在着相似的处理方案,本文最重要的意义是提出并实现了在各个端逻辑统一的数据处理方法

还能够作的更好

为何咱们要将路径约定为一个字符串,而不是一串参数或者一个数组呢?由于这里还有一个更赞的升级功能:根据模糊路径搜索数据

好比,有一个接口返回了文章的点赞列表,若是要取第一个用户名,能够用 HaoResult.find("results>0>username") 来定位路径提取数据。

那么,若是要取出全部的用户名呢?

咱们实现了 search 方法,能够用 HaoResult.search("results>\d+>username") 来得到用户名组成的数组,酷吧:)

简单的说,search 方法的参数是一个正则字符串,使用该正则去在全部的路径中尝试匹配,而后再将匹配到路径的数据都取出来。

后语

本想在本文中列出更多的代码来做补充说明,然而仔细想一想,本文最重要的就是一个解决问题的思路方向,又何须堆叠更多的代码文字呢。

文中提供了各语言的实现代码范例,仅供参考,也可略做修改后便可使用。

本文是 HaoObject.js 系列的前置文章,至于如何在 Vue 下将数据也玩出点花样儿来,敬请期待。

原文来自阿星的博客: wanyaxing.com/blog/201808…

相关文章
相关标签/搜索