2 разных объекта Json печатаются в качестве ответа, как их разделить и прочитать значение элемента во втором объекте

#java #response #jsonpath

#java #ответ #jsonpath

Вопрос:

Я получаю несколько объектов json в http-ответе.

Например:

 {
    "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 , он выбирает 1-й объект и возвращает null. Как я могу пропустить 1-й объект и перейти ко второму объекту? Я пытаюсь решить эту проблему, добавив ответ (строку) в JSONObject, но получаю некоторые ошибки.

Комментарии:

1. Покажите свой код и объясните, в какой среде вы работаете (консольное приложение, приложение с графическим интерфейсом, Джерси, Spring MVC).

2. Это массив результатов? Не могли бы вы, пожалуйста, опубликовать полный ответ? Вы используете Java?

3. @ReazMurshed это полный ответ, который я разбил здесь на 2 разные части, в моем случае я просто печатаю его целиком одну за другой. Да, я использую java

4. Если это полный ответ, то это недопустимый ответ JSON. Ответ должен содержать открывающую третью фигурную скобку [ и закрывающую ] фигурную скобку, чтобы указать, что это массив результатов.

5. @ReazMurshed в нем есть 2 отдельных объекта json, есть ли способ, которым я могу просто проигнорировать 1-й объект и перейти ко второму объекту? (Это не массив json)

Ответ №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, а затем получить оставшуюся часть строки после получения первого. Я использовал JSONTokener для получения первого JSONObject . Затем я взял длину объекта и, следовательно, я получил вторую строку JSON, используя substring метод.

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": 0n"  
    "                },n"  
    "                "additionalProp2": {n"  
    "                    "Score": 0,n"  
    "                    "FalseDiscoveryRate": 0n"  
    "                },n"  
    "                "additionalProp3": {n"  
    "                    "Score": 0,n"  
    "                    "FalseDiscoveryRate": 0n"  
    "                }n"  
    "            }n"  
    "        }]n"  
    "    }n"  
    "}";
  

Пожалуйста, обратите внимание, что для того, чтобы получить точный индекс для substring , нам нужно удалить все пробелы и новые строки с помощью replaceAll функции, которую я использовал. Надеюсь, этот маленький трюк поможет вам.