有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用JSONPATH规范化嵌套json

我有一个嵌套的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,我能做的就是检索成员列表并在其上循环,以形成规范化的数据。但我觉得对于一个庞大的数据来说,它不会有效率。 在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) 个答案

  1. # 1 楼答案

    您可以使用Jackson库将JSON映射到Java对象,实现到其他所需Java模型对象的转换器,然后将其导出为JSON。你也可以考虑使用谷歌GSON。 不过,如果您编写了适当的自定义实现,那么使用健壮的库就无法打败它