JSONPath получить элемент массива в виде строки JSON
Я пытаюсь прочитать содержимое JSON-файла в Java и получить каждый элемент в виде строки JSON. Мои попытки не увенчались успехом.
Давайте предположим, что здесь находится базовый JSON:
{ "book": [
{ "category": "",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": ""
},
{ "category": "fiction",
"author": "",
"title": "Sword of Honour",
"price": "12.99"
},
{ "category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": "8.99"
},
{ "category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
]
}
И я перебираю весь массив, и мне нужно получить каждый элемент в виде строки JSON (некоторые свойства могут быть пустыми). Итак, первая строка будет:
{ "category": "",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": ""
}
Что я сделал, это:
String response = Unirest.get(db).header("cache-control", "no-cache").asString().getBody();
int length = JsonPath.read(response, "$.book.length()");
System.out.println(length);
for (int i = 0; i < length; i++) {
String json = JsonPath.read(response, "$.book["+i+"]").toString();
System.out.println("1111111\n"+json);
process(json);
}
Но то, что я получаю, грязное, а не та же самая строка. Не включает ""
,
Каково решение?
1 ответ
Как я упоминал в комментариях, JsonPath будет читать объект JSON и возвращать его следующим образом. Это будет похоже на HashMap с типами, определяемыми тем, что было проанализировано. Если вы, как вы упомянули, после извлечения хотите получить значения в виде Json, вам необходимо снова преобразовать то, что было прочитано, в Json:
public static void main(String[] args) {
String response = "{ \"book\": [ " +
" { \"category\": \"\"," +
" \"author\": \"Nigel Rees\"," +
" \"title\": \"Sayings of the Century\"," +
" \"price\": \"\"" +
" }," +
" { \"category\": \"fiction\"," +
" \"author\": \"\"," +
" \"title\": \"Sword of Honour\"," +
" \"price\": \"12.99\"" +
" }," +
" { \"category\": \"fiction\"," +
" \"author\": \"Herman Melville\"," +
" \"title\": \"Moby Dick\"," +
" \"isbn\": \"0-553-21311-3\"," +
" \"price\": \"8.99\"" +
" }," +
" { \"category\": \"fiction\"," +
" \"author\": \"J. R. R. Tolkien\"," +
" \"title\": \"The Lord of the Rings\"," +
" \"isbn\": \"0-395-19395-8\"," +
" \"price\": 22.99" +
" }" +
" ]" +
"}";
int length = JsonPath.read(response, "$.book.length()");
System.out.println(length);
Configuration conf = Configuration.defaultConfiguration();
Object document = Configuration.defaultConfiguration().jsonProvider().parse(response);
for (int i = 0; i < length; i++) {
String json = conf.jsonProvider().toJson(JsonPath.read(document, "$.book["+i+"]"));
System.out.println(json);
//process(json);
}
}
Это выведет:
{"category":"","author":"Nigel Rees","title":"Sayings of the Century","price":""}
{"category":"fiction","author":"","title":"Sword of Honour","price":"12.99"}
{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":"8.99"}
{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}
Я только что узнал об этом в Документах, использование конфигурации для синтаксического анализа json заставит ваш код проанализировать его только один раз. Это может быть даже улучшено (чтобы удалить int length
вещи), но я оставлю это на ваше усмотрение:)