使用JSONPATH规范嵌套的json

时间:2019-06-09 09:17:26

标签: java jsonpath

我有一个嵌套的json,我想使用Java中的JsonPath进行标准化/拼合。

我的JSON如下:

{
    "FamilyName": "Smith",
    "City":"NY",
    "Members":[{
        "Name" : "jacob",
        "Age" : "19",
        "Gender" : "Male"
    },{
        "Name" : "Sophia",
        "Age" : "29",
        "Gender" : "Female"
    }]

}

我要检索的是标准化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<String> columnList = (List<String>) Arrays.asList(
            "$.FamilyName-String",
            "$.City-String"
    );
    static String arrayPath = "$.Members";

    static List<String> arrayColumnList = (List<String>) Arrays.asList(
            "$.Name-String",
            "$.Age-Integer",
            "$.Gender-String"
            );

    static Map<String, Class<?>> dataTypeMap = new HashMap<String, Class<?>>() {
        {
            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<Map<String, Object>> nested = parsedDocumentContext.read(arrayPath, List.class);
        for (Map<String, Object> eachMembers : nested) {
            //List eachValue = new ArrayList<Object>(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;
    }
}

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用Jackson库将JSON映射到Java对象,将转换器实现为其他所需的Java模型对象,然后将其导出为JSON。您也可以考虑使用Google Gson。 虽然如果您编写适当的自定义实现代码,则绝对不能用健壮的库来击败它。