文章目錄
- 一、JSON結構轉換是什么?
- 二、術語解釋
- 三、案例之《JSON對象 To JSON數組》
- 四、代碼實現
- 五、在線轉換工具
- 六、技術資料
一、JSON結構轉換是什么?
JSON結構轉換指的是將一個JSON對象或JSON數組按照一定規則進行重組、篩選、映射或轉換,生成新的JSON對象或數組的過程。這種轉換可以包括改變JSON數據的結構、提取特定字段、合并多個JSON數據,或者對數據進行計算和處理等操作。
在JSON結構轉換中,常見的操作包括:
- 提取字段:從一個JSON對象中提取特定字段,生成新的JSON對象。
- 過濾數據:根據條件過濾JSON數據,生成符合條件的新JSON對象或數組。
- 映射轉換:將一個JSON對象中的字段映射到另一個字段,生成新的JSON對象。
- 合并數據:將多個JSON對象或數組合并成一個新的JSON對象或數組。
JSON結構轉換通常在數據處理、數據清洗、數據分析等場景中廣泛應用。通過結構轉換,可以根據需求定制化地處理JSON數據,使其符合特定的業務邏輯或數據格式要求。
為此我們提供了三個簡單開源的類庫(JavaScript類庫、Java類庫、.Net類庫),接下來我們對JS類庫進行詳細講解。
二、術語解釋
1.轉換映射【高級配置選項】
轉換映射包含兩種
-
交叉映射(默認)
交叉映射主要是針對一對多、多對一、多對多的情況 -
一對一映射
一對一映射主要是針對一對一情況,此種情況需要注意,由于對象的屬性每次重組后順序無法控制,所以盡量通過屬性名稱進行精準映射
三、案例之《JSON對象 To JSON數組》
源JSON結構:
{"a": {"c_child": "2", "d_child": "3", "e_child": "4"}
}
目標JSON結構:
{"b1": [[{"k1_child": "v1_child"}],[{"k2_child": "v2_child"}],[{"k3_child": "v3_child"}]]
}
轉換需求:
以下需求分別執行
- 一對多:將源結構的“a.c_child”值追加到目標結構的“b1[*]”值
- 多對一:將源結構的“a.*”值追加到目標結構的“b1.[0]”值
- 多對多:將源結構的“a.*”值追加到目標結構的“b1[*]”值
- 一對一:將源結構的“a.*”鍵追加到目標結構的“b1[*]”值
四、代碼實現
1.一對多:將源結構的“a.c_child”值追加到目標結構的“b1[*]”值
import com.fasterxml.jackson.databind.ObjectMapper;import java.util.ArrayList;
import java.util.List;
/*** 對象轉換對象*/
public class Main {public static void main(String[] args) {ObjectMapper mapper = new ObjectMapper();String orgJson = "{\"a\":{\"c_child\":\"2\",\"d_child\":\"3\",\"e_child\":\"4\"}}"; // JSON字符串String aimJson = "{\"b1\":[[{\"k1_child\":\"v1_child\"}],[{\"k2_child\":\"v2_child\"}],[{\"k3_child\":\"v3_child\"}]]}"; // JSON字符串List<JsonMapping> jsonMappings = new ArrayList<>();jsonMappings.add(new JsonMapping("root.b1[*]", "root.a.c_child", 4,new JsonMappingOptions(0,1,1,1)));JsonTranferUtil jsonTranferUtil = null;String result ="";try {jsonTranferUtil = new JsonTranferUtil(orgJson, aimJson, jsonMappings);result = jsonTranferUtil.tranJson();} catch (Exception e) {e.printStackTrace();}System.out.println("******************結果 **********************");System.out.println(result);}
}
執行結果如下:
2.多對一:將源結構的“a.*”值追加到目標結構的“b1.[0]”值
import com.fasterxml.jackson.databind.ObjectMapper;import java.util.ArrayList;
import java.util.List;
/*** 對象轉換對象*/
public class Main {public static void main(String[] args) {ObjectMapper mapper = new ObjectMapper();String orgJson = "{\"a\":{\"c_child\":\"2\",\"d_child\":\"3\",\"e_child\":\"4\"}}"; // JSON字符串String aimJson = "{\"b1\":[[{\"k1_child\":\"v1_child\"}],[{\"k2_child\":\"v2_child\"}],[{\"k3_child\":\"v3_child\"}]]}"; // JSON字符串List<JsonMapping> jsonMappings = new ArrayList<>();jsonMappings.add(new JsonMapping("root.b1[0]", "root.a.*", 4,new JsonMappingOptions(0,1,1,1)));JsonTranferUtil jsonTranferUtil = null;String result ="";try {jsonTranferUtil = new JsonTranferUtil(orgJson, aimJson, jsonMappings);result = jsonTranferUtil.tranJson();} catch (Exception e) {e.printStackTrace();}System.out.println("******************結果 **********************");System.out.println(result);}
}
執行結果如下:
3.多對多:將源結構的“a.*”值追加到目標結構的“b1[*]”值
import com.fasterxml.jackson.databind.ObjectMapper;import java.util.ArrayList;
import java.util.List;
/*** 對象轉換對象*/
public class Main {public static void main(String[] args) {ObjectMapper mapper = new ObjectMapper();String orgJson = "{\"a\":{\"c_child\":\"2\",\"d_child\":\"3\",\"e_child\":\"4\"}}"; // JSON字符串String aimJson = "{\"b1\":[[{\"k1_child\":\"v1_child\"}],[{\"k2_child\":\"v2_child\"}],[{\"k3_child\":\"v3_child\"}]]}"; // JSON字符串List<JsonMapping> jsonMappings = new ArrayList<>();jsonMappings.add(new JsonMapping("root.b1[*]", "root.a.*", 4,new JsonMappingOptions(0,1,1,1)));JsonTranferUtil jsonTranferUtil = null;String result ="";try {jsonTranferUtil = new JsonTranferUtil(orgJson, aimJson, jsonMappings);result = jsonTranferUtil.tranJson();} catch (Exception e) {e.printStackTrace();}System.out.println("******************結果 **********************");System.out.println(result);}
}
執行結果如下:
4.一對一:將源結構的“a.*”鍵追加到目標結構的“b1[*]”值
import com.fasterxml.jackson.databind.ObjectMapper;import java.util.ArrayList;
import java.util.List;
/*** 對象轉換對象*/
public class Main {public static void main(String[] args) {ObjectMapper mapper = new ObjectMapper();String orgJson = "{\"a\":{\"c_child\":\"2\",\"d_child\":\"3\",\"e_child\":\"4\"}}"; // JSON字符串String aimJson = "{\"b1\":[[{\"k1_child\":\"v1_child\"}],[{\"k2_child\":\"v2_child\"}],[{\"k3_child\":\"v3_child\"}]]}"; // JSON字符串List<JsonMapping> jsonMappings = new ArrayList<>();jsonMappings.add(new JsonMapping("root.b1[*]", "root.a.*", 4,new JsonMappingOptions(0,1,1,2)));JsonTranferUtil jsonTranferUtil = null;String result ="";try {jsonTranferUtil = new JsonTranferUtil(orgJson, aimJson, jsonMappings);result = jsonTranferUtil.tranJson();} catch (Exception e) {e.printStackTrace();}System.out.println("******************結果 **********************");System.out.println(result);}
}
執行結果如下:
五、在線轉換工具
為了讓使用者更加方便的配置出映射關系,為此開發了一套在線轉換工具,可在工具中通過拖拽即可配置想要的結構轉換關系,并可對轉換關系所能實現的效果實時進行預覽更改。
工具地址:數據轉換工具
六、技術資料
- Github:edq-ebara/data-transformation-javascript: 數據轉化(javascript) (github.com)
- 技術探討QQ群:775932762
- 工具連接:數據轉換工具
- 御控官網:https://www.yu-con.com/