2个不同的Json对象作为响应被打印,如何将它们分离并读取第二个对象中元素的值

时间:2019-03-04 00:57:05

标签: java response jsonpath

我在http响应中得到了多个json对象。

例如:

{
    "result": {
        "Status": "complete",
        "id1": "<id1>",
        "id2": "<id2>",
        "Fields": [{
            "fid": "1",
            "FName": "<name>"
        }, {
            "fid": "2",
            "FName": "<name>"
        }, {
            "fid": "3",
            "FName": "<name>"
        }, {
            "fid": "4",
            "FName": "<name>"
        }]
    }
}

下一个对象是

{
    "result": {
        "Status": "complete",
        "id1": "<id1>",
        "id2": "<id2>",
        "Fields": [{
            "fid": "1",
            "FName": "<name>"
        }, {
            "fid": "2",
            "FName": "<name>"
        }, {
            "fid": "3",
            "FName": "<name>"
        }, {
            "fid": "4",
            "FName": "<name>"
        }],
        "TokenPairs": [{
            "Token1": "<token1>",
            "Token2": "<token2>",
            "FieldMatches": {
                "additionalProp1": {
                    "Score": 0,
                    "FalseDiscoveryRate": 0
                },
                "additionalProp2": {
                    "Score": 0,
                    "FalseDiscoveryRate": 0
                },
                "additionalProp3": {
                    "Score": 0,
                    "FalseDiscoveryRate": 0
                }
            }
        }]
    }
}

我实际上想检查TokenPairs,但是当我检查jsonPath时,它将拾取第一个对象并返回null。如何跳过第一个对象并转到第二个对象?我正在尝试通过将响应(字符串)添加到JsonObject来解决此问题,但出现了一些错误。

1 个答案:

答案 0 :(得分:1)

我想我为您找到了解决方案。我想为您提供以下功能,它将为您提供两个单独的JSON字符串。

public void JSONSeparator(String JsonString) {
   try {
        JSONObject object1 = (JSONObject) new JSONTokener(jsonString.replaceAll("\\s+", "")).nextValue();
        String firstJson = object1.toString().trim();
        String nextJson = jsonString.replaceAll("\\s+", "").substring(firstJson.length());

        System.out.println("First JSON String: " + firstJson);
        System.out.println("Second JSON String: " + nextJson);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

这个想法是获取第一个JSON令牌,然后在获取第一个JSON令牌后获取字符串的其余部分。我使用JSONTokener来拾取第一个JSONObject。然后使用对象的长度,因此我使用substring方法获得了第二个JSON字符串。

以下是我用来传递此功能的JsonString

private String jsonString = "{\n" +
    "    \"result\": {\n" +
    "        \"Status\": \"complete\",\n" +
    "        \"id1\": \"<id1>\",\n" +
    "        \"id2\": \"<id2>\",\n" +
    "        \"Fields\": [{\n" +
    "            \"fid\": \"1\",\n" +
    "            \"FName\": \"<name>\"\n" +
    "        }, {\n" +
    "            \"fid\": \"2\",\n" +
    "            \"FName\": \"<name>\"\n" +
    "        }, {\n" +
    "            \"fid\": \"3\",\n" +
    "            \"FName\": \"<name>\"\n" +
    "        }, {\n" +
    "            \"fid\": \"4\",\n" +
    "            \"FName\": \"<name>\"\n" +
    "        }]\n" +
    "    }\n" +
    "}" + "{" +
    "    \"result\": {\n" +
    "        \"Status\": \"complete\",\n" +
    "        \"id1\": \"<id1>\",\n" +
    "        \"id2\": \"<id2>\",\n" +
    "        \"Fields\": [{\n" +
    "            \"fid\": \"1\",\n" +
    "            \"FName\": \"<name>\"\n" +
    "        }, {\n" +
    "            \"fid\": \"2\",\n" +
    "            \"FName\": \"<name>\"\n" +
    "        }, {\n" +
    "            \"fid\": \"3\",\n" +
    "            \"FName\": \"<name>\"\n" +
    "        }, {\n" +
    "            \"fid\": \"4\",\n" +
    "            \"FName\": \"<name>\"\n" +
    "        }],\n" +
    "        \"TokenPairs\": [{\n" +
    "            \"Token1\": \"<token1>\",\n" +
    "            \"Token2\": \"<token2>\",\n" +
    "            \"FieldMatches\": {\n" +
    "                \"additionalProp1\": {\n" +
    "                    \"Score\": 0,\n" +
    "                    \"FalseDiscoveryRate\": 0\n" +
    "                },\n" +
    "                \"additionalProp2\": {\n" +
    "                    \"Score\": 0,\n" +
    "                    \"FalseDiscoveryRate\": 0\n" +
    "                },\n" +
    "                \"additionalProp3\": {\n" +
    "                    \"Score\": 0,\n" +
    "                    \"FalseDiscoveryRate\": 0\n" +
    "                }\n" +
    "            }\n" +
    "        }]\n" +
    "    }\n" +
    "}";

请注意,为了获得substring的精确索引,我们需要使用我使用的replaceAll函数删除所有空格和新行。希望这个小技巧能对您有所帮助。