1. 概述
1.1 版本
| FineDataLink 版本 | 功能變動 |
|---|---|
| 3.5.1 | 「資料轉換」節點新增算子「JSON 解析」;支援將 JSON 結構的資料匯出為行列格式 |
| 4.1.1 | 將 API body 的回應欄位名稱從 default 改為 responseBody |
| 4.1.6.2 |
|
| 4.1.13.3 | JSON 解析遇到控制字元時不報錯,解析後就按照分離字元進行解析 |
| 4.2.10.1 |
|
1.2 應用場景
透過 API 取數,或者從一些非關係型、關係型資料庫裏讀取資料時,存在取到的資料包含 JSON 格式資料的情況。
而且許多情況下,JSON 格式的資料並不標準,並不能直接映射成二維表資料使用。
「JSON 解析」算子可以解析 JSON 結構的資料,匯出行列格式的資料。
1.3 功能簡介
「JSON 解析」算子透過獲取上游匯出的 JSON 資料,將其自訂解析成需要的欄位並匯出給下游。
範例:
例如某列 JSON 為:

「JSON 解析」算子解析後,為:

注:JSON 解析時,不支援同時提取不同層級的欄位並擴展,使用者可以使用多個 JSON 解析算子進行多個層級的解析,詳情參見本文 3.4 節。
2. 功能說明
「JSON 解析」算子配置介面如下圖所示:

2.1 選擇源欄位
在下拉框中選擇待解析的欄位。
4.1.6.2 及之後版本,JSON解析支援同時解析多個欄位,減少「簡道雲輸入」多個複雜欄位的解析成本,在「JSON解析」中新增解析多個欄位的能力。
在源欄位選擇多個欄位後,即可在「選擇JSON節點」中同時解析多個欄位,如下圖所示:

如果上游為「API 輸入」算子,一般預設選擇 responseBody。如下圖所示:

若上游為「DB表輸入」或者其他輸入算子,則可以選擇需要解析的 JSON 來源欄位。如下圖所示:

2.2 保留上游匯出欄位
4.2.10.1 及之後版本,原「解析後保留所有匯出欄位」改名為「保留上游匯出欄位」,且支援自訂勾選需要保留的上游匯出欄位。
未勾選該按鈕:只保留所選源欄位解析後的資料;
勾選該按鈕:保留上游所有的匯出欄位+所選源欄位解析後的資料;
勾選該按鈕並設定「選部分」欄位:保留所選上游匯出欄位+所選源欄位解析後的資料;

以 JSON解析算子典型範例 文檔中的範例為例:

2.3 解析 JSON 資料
選擇 JSON 節點,即可解析:
所有生成JsonPath預設從根節點開始,生成完整的絕對路徑,使用者可手動修改。
注1:json 解析的時候建議選擇最開始的節點,此時為絕對路徑下的解析,否則直接勾選指定欄位,使用相對路徑解析,資料解析結果可能會有錯誤。
注2:可使用多個「JSON解析」算子解析「嵌套JSON」資料。

支援修改欄位名稱、新增欄位等操作。如下圖所示:
4.2.10.1 及之後版本,支援配置欄位類型,將以指定的欄位類型讀取資料,可選類型為:varchar、int、long、float、double、timestamp、boolean、date。

3. 不同場景中JSON解析說明
3.1 解析全量欄位資料
在「選擇JSON節點」時,使用者可以透過貼上JSON正文的方式修改選擇節點的內容,以防止出現上游有多行 JSON 正文流進時,因為第一欄的JSON屬性較少,導致其他json屬性無法直接選擇的情況。
例如,若選擇節點處缺少需要選擇的 JSON 屬性,則可以手動貼上包含需要選擇的 JSON 屬性正文,如下圖所示:
然後即可在節點中選擇想要解析的欄位。

3.2 解析不同層級的欄位
範例:
4.1.6.2 及之後版本,支援同時解析一個 JSON 源欄位的陣列部分和非陣列部分。
例如想要解析在不同層級中的 class 和 name 欄位,則可直接選擇對應的欄位,即可同時解析一個資料源的陣列和非陣列部分,如下圖所示:
4.1.6.2 之前的版本則無法直接同時解析一個JSON源欄位的陣列部分和非陣列部分。

使用「JSON解析」算子解析子表單資料時,希望解析出在不同層級中的 level 和 name 欄位,如下圖所示解析時,將報錯:
json 解析結果行數不匹配。

原因是暫不支援:JSON 解析時,同時提取不同層級的欄位並擴展。
解決方案:
可分兩次進行解析,先解析出同層級的 level 和 department 欄位,第二次解析出 department 下的 name 欄位。

3.3 JSON 資料有多層級且不同層級存在同名欄位
4.1.6.2 及之後版本,當 JSON 資料存在多層且有同名欄位時,會自動給重名欄位增加後綴,如下圖所示:

3.4 多個 JSON 解析算子解析不同欄位但解析後的欄位同名
範例:
注:4.1.6.2 及之後版本不會出現此問題。
使用兩個「JSON解析」算子,分別解析兩個不同欄位。但「選擇JSON節點」時,兩個「JSON解析」算子選擇的欄位名相同,都為 name 。如下圖所示:

此場景下,若有多個「JSON解析」算子,解析後欄位名稱不能相同,需要修改解析後欄位名稱。否則,後面的同名欄位會改寫前面的同名欄位。如下圖所示:

