【问题标题】:Search multiple JSON files and extract values based on some condition in Java搜索多个 JSON 文件并根据 Java 中的某些条件提取值
【发布时间】:2019-12-11 11:39:11
【问题描述】:

我有一个场景,其中有多个 JSON 文件。我想从与我提供的条件匹配的所有 JSON 文件中提取值。

例如:

{
    "glossary": {
        "title": "example glossary",
        "GlossDiv": {
            "title": "S",
            "GlossList": {
                "GlossEntry": {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef": {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

我有条件提取所有具有"Acronym": "SGML"GlossEntryID

我对 JSON 非常陌生,因此我们将不胜感激。

【问题讨论】:

    标签: java json extract


    【解决方案1】:

    尝试下面的代码来解析 json 并检查条件

    try {
            String json = "{" +
                    "    \"glossary\": {" +
                    "        \"title\": \"example glossary\"," +
                    "        \"GlossDiv\": {" +
                    "            \"title\": \"S\"," +
                    "            \"GlossList\": {" +
                    "                \"GlossEntry\": {" +
                    "                    \"ID\": \"SGML\"," +
                    "                    \"SortAs\": \"SGML\"," +
                    "                    \"GlossTerm\": \"Standard Generalized Markup Language\"," +
                    "                    \"Acronym\": \"SGML\"," +
                    "                    \"Abbrev\": \"ISO 8879:1986\"," +
                    "                    \"GlossDef\": {" +
                    "                        \"para\": \"A meta-markup language, used to create markup languages such as DocBook.\"," +
                    "                        \"GlossSeeAlso\": [\"GML\", \"XML\"]" +
                    "                    }," +
                    "                    \"GlossSee\": \"markup\"" +
                    "                }" +
                    "            }" +
                    "        }" +
                    "    }" +
                    "}";
    
            // parse the whole JSON string into JSONObject
            JSONObject obj = new JSONObject(json);
            // retrieve glossary obj from JSON
            JSONObject glossary = obj.getJSONObject("glossary");
            // retrieve GlossDiv obj from glossary
            JSONObject GlossDiv = glossary.getJSONObject("GlossDiv");
            // retrieve GlossList obj from GlossDiv
            JSONObject GlossList = GlossDiv.getJSONObject("GlossList");
            // retrieve GlossEntry obj from GlossList
            JSONObject GlossEntry = GlossList.getJSONObject("GlossEntry");
            // Check condition
            if (GlossEntry.getString("Acronym").equalsIgnoreCase("SGML")) {
                String id = GlossEntry.getString("ID");
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    

    【讨论】:

    • 如果我必须搜索多个 JSON 文件并获得所有匹配的结果,我是否应该将所有 JSOn 文件作为输入循环?
    【解决方案2】:

    如果你使用Jayway JsonPath,你可以简单地实现如下:

    Maven 依赖

    <dependency>
        <groupId>com.jayway.jsonpath</groupId>
        <artifactId>json-path</artifactId>
        <version>2.4.0</version>
    </dependency>
    

    代码片段

    DocumentContext jsonContext = JsonPath.parse(jsonStr);
    List<String> idList = jsonContext.read("$.glossary.GlossDiv.GlossList.GlossEntry[?(@.Acronym == 'SGML')].ID");
    System.out.println(idList.toString());
    

    控制台输出

    [“SGML”]

    然后您可以按顺序或并行读取这些 JSON 文件以组合这些结果。

    【讨论】:

    • @praveen rego 如果我的解决方案确实解决了您的问题,请接受它作为答案,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多