#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
функции, которую я использовал. Надеюсь, этот маленький трюк поможет вам.