比如以下是一个范例的嵌套 JSON 示例:
{ 34;设备ID": "device_001", "韶光戳": "2024-06-02T12:34:56Z", "传感器数据": { "温度": { "值": 22.5, "单位": "摄氏度" }, "湿度": { "值": 60, "单位": "%" }, "位置": { "经度": 120.12345, "纬度": 30.12345, "海拔": 15.5 } }}
以上的数据机构会对我们事情有几个不太友好的地方:
1、在进行数据洗濯与预处理时,常常须要对数据进行洗濯和预处理。以上的数据是无法实现例如排序、过滤和聚合等操作的。
2、在关系型数据库中,嵌套的 JSON 构造不易存储。
3、机器学习算法哀求输入的数据是扁平化的数值矩阵。
扁平化 JSON后:
{ "设备ID": "device_001", "韶光戳": "2024-06-02T12:34:56Z", "传感器数据_温度_值": 22.5, "传感器数据_温度_单位": "摄氏度", "传感器数据_湿度_值": 60, "传感器数据_湿度_单位": "%", "传感器数据_位置_经度": 120.12345, "传感器数据_位置_纬度": 30.12345, "传感器数据_位置_海拔": 15.5}
那我们该如何将嵌套的JSON数据构造扁平化呢?
json-flattener这是一个专门为 Javaer 做事的工具类。
项目路径:https://github.com/wnameless/json-flattener
紧张实现以下2个功能:
1、将嵌套的 JSON 工具扁平化;
2、将扁平化的 JSON 工具规复到原始的嵌套构造。
其余,json-flattener 支持多种主流的 JSON 处理库,包括 Jackson、Gson、org.json 和Jakarta,这使得它能够与不同的项目和环境合营利用。
安装仓库
<dependency> <groupId>com.github.wnameless.json</groupId> <artifactId>json-flattener</artifactId> <version>${newestVersion}</version></dependency>
快速开始
有下面一个json字符串。
String json = "{ \"a\" : { \"b\" : 1, \"c\": null, \"d\": [false, true] }, \"e\": \"f\", \"g\":2.3 }";// { "a":// { "b": 1,// "c": null,// "d": [false, true]// },// "e": "f",// "g": 2.3// }
扁平化为 Java Map
Map<String, Object> flattenJson = JsonFlattener.flattenAsMap(json);打印// {a.b=1, a.c=null, a.d[0]=false, a.d[1]=true, e=f, g=2.3}
扁平化为 JSON 字符串
String jsonStr = JsonFlattener.flatten(json);打印// {"a.b":1,"a.c":null,"a.d[0]":false,"a.d[1]":true,"e":"f","g":2.3}
从 JSON 字符串还原
String nestedJson = JsonUnflattener.unflatten(jsonStr);打印// {"a":{"b":1,"c":null,"d":[false,true]},"e":"f","g":2.3}
利用保留字符扁平化或取消扁平化
// 支持包含点或方括号的 JSON String flattendJsonWithDotKey = JsonFlattener.flatten("[{\"a.a.[\":1},2,{\"c\":[3,4]}]");打印// {"[0][\"a.a.[\"]":1,"[1]":2,"[2].c[0]":3,"[2].c[1]":4}String nestedJsonWithDotKey = JsonUnflattener.unflatten( "{\"[1][0]\":2,\"[0]\":1,\"[1][1]\":3,\"[2]\":4,\"[3][\\\"ab.c.[\\\"]\":5}"); 打印// [1,[2,3],4,{"ab.c.[":5}]
P.S. 几个JSON处理库的比拟