java嵌入jsonpath语法,java - 使用JSONPATH规范嵌套的json - 堆栈内存溢出

我有一个嵌套的json,我想使用Java中的JsonPath进行归一化/展平。

我的JSON如下:

{

"FamilyName": "Smith",

"City":"NY",

"Members":[{

"Name" : "jacob",

"Age" : "19",

"Gender" : "Male"

},{

"Name" : "Sophia",

"Age" : "29",

"Gender" : "Female"

}]

}

我要检索的是Normalized json,如下所示:

[

{

"FamilyName": "Smith",

"City":"NY",

"Name" : "jacob",

"Age" : "19",

"Gender" : "Male"

},

{

"FamilyName": "Smith",

"City":"NY",

"Name" : "Sophia",

"Age" : "29",

"Gender" : "Female"

}

]

使用JsonPath,我能做的是检索成员列表并在其上循环,以形成标准化数据MySelf。 但是我觉得对于海量数据它不会有效。 jsonpath中有什么有效的方法可以用来获取所需的输出吗?

更新

示例代码:[这只是示例代码,而不是实际的示例代码。 我只是试图将用例放在这里。]

import java.util.Arrays;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import com.google.gson.JsonArray;

import com.google.gson.JsonObject;

import com.google.gson.JsonParser;

import com.jayway.jsonpath.DocumentContext;

import com.jayway.jsonpath.JsonPath;

import com.jayway.jsonpath.ReadContext;

public class TestApp {

static JsonParser jsonParser = new JsonParser();

static List columnList = (List) Arrays.asList(

"$.FamilyName-String",

"$.City-String"

);

static String arrayPath = "$.Members";

static List arrayColumnList = (List) Arrays.asList(

"$.Name-String",

"$.Age-Integer",

"$.Gender-String"

);

static Map> dataTypeMap = new HashMap>() {

{

put("String", String.class);

put("Integer", Integer.class);

}

};

static String data = "{\"FamilyName\": \"Smith\",\"City\":\"NY\",\"Members\":[{ \"Name\" : \"jacob\", \"Age\" : \"19\", \"Gender\" : \"Male\"},{ \"Name\" : \"Sophia\", \"Age\" : \"29\", \"Gender\" : \"Female\"}]}";

public static void main(String[] args) {

DocumentContext parsedDocumentContext = ParserFactory.getJsonParseContext().parse(data);

JsonArray processedList= processData(parsedDocumentContext);

System.out.println(processedList);

// Do further operations

}

public static JsonArray processData(DocumentContext parsedDocumentContext) {

JsonObject values = new JsonObject();

for (String eachColumn : columnList) {

String array[] = eachColumn.split("-");

String eachField[] = array[0].split("\\.");

values.addProperty(eachField[eachField.length - 1], (String) parsedDocumentContext.read(array[0], dataTypeMap.get(array[1])).toString());

}

JsonArray allValues = new JsonArray();

if (null == arrayPath || arrayPath.isEmpty()) {

allValues.add(values);

return allValues;

}

List> nested = parsedDocumentContext.read(arrayPath, List.class);

for (Map eachMembers : nested) {

//List eachValue = new ArrayList(values);

JsonObject eachValue = jsonParser.parse(values.toString()).getAsJsonObject();

ReadContext readContext = JsonPath.parse(eachMembers);

for (String eachColumn : arrayColumnList) {

String array[] = eachColumn.split("-");

String eachField[] = array[0].split("\\.");

eachValue.addProperty(eachField[eachField.length - 1], readContext.read(array[0], dataTypeMap.get(array[1])).toString());

}

allValues.add(eachValue);

}

return allValues;

}

}

我在这里先向您的帮助表示感谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值