如何讀取 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…

相關文章
相關標籤/搜索