Основное использование JSONPath в Java
У меня JSON как строка и JSONPath как строка. Я хотел бы запросить JSON с помощью пути JSON, получив в результате JSON строку.
Я понимаю, что Jayway json-path является стандартом. онлайновый API, однако, не имеет большого отношения к фактическая библиотека, которую вы получаете от Maven. GrepCode версия примерно совпадает, хотя.
Кажется, я должен быть в состоянии сделать:
String originalJson; //these are initialized to actual data
String jsonPath;
String queriedJson = JsonPath.<String>read(originalJson, jsonPath);
Проблема заключается в том, что read
возвращает то, что кажется наиболее подходящим, исходя из того, что фактически находит JSONPath (например, List<Object>
, String
, double
и т.д.), поэтому мой код генерирует исключение для определенных запросы. Представляется довольно разумным предположить, что будет какой-то способ запросить JSON и вернуть JSON; любые предложения?
Ответы
Ответ 1
Определенно существует способ запросить Json и вернуть Json с помощью JsonPath.
См. Пример ниже:
String jsonString = "{\"delivery_codes\": [{\"postal_code\": {\"district\": \"Ghaziabad\", \"pin\": 201001, \"pre_paid\": \"Y\", \"cash\": \"Y\", \"pickup\": \"Y\", \"repl\": \"N\", \"cod\": \"Y\", \"is_oda\": \"N\", \"sort_code\": \"GB\", \"state_code\": \"UP\"}}]}";
String jsonExp = "$.delivery_codes";
JsonNode pincodes = JsonPath.read(jsonExp, jsonString, JsonNode.class);
System.out.println("pincodesJson : "+pincodes);
Выходом выше будет внутренний Json.
[{ "postal_code": { "р": "Газиабад", "контактный": 201001, "pre_paid": "Y", "наличными": "Y", "пикап": "Y", "REPL": "N", "треска": "Y", "is_oda": "N", "sort_code": "ГБ", "state_code": "ВВЕРХ" }}]
Теперь каждая отдельная пара имен/значений может быть проанализирована путем итерации списка (JsonNode), который мы получили выше.
for(int i = 0; i< pincodes.size();i++){
JsonNode node = pincodes.get(i);
String pin = JsonPath.read("$.postal_code.pin", node, String.class);
String district = JsonPath.read("$.postal_code.district", node, String.class);
System.out.println("pin :: " + pin + " district :: " + district );
}
Выход будет:
pin:: 201001 район:: Газиабад
В зависимости от Json, который вы пытаетесь проанализировать, вы можете решить, следует ли получать список или просто одно значение String/Long.
Надеюсь, что это поможет в решении вашей проблемы.
Ответ 2
API Java JsonPath, найденный в jayway JsonPath, возможно, немного изменился со всех приведенных выше ответов/комментариев. Документация тоже. Просто следуйте приведенной выше ссылке и прочитайте, что README.md, в ней содержится очень понятная документация об использовании IMO.
В принципе, с текущей последней версии 2.2.0 библиотеки существует несколько разных способов достижения того, что было запрошено здесь, например:
Pattern:
--------
String json = "{...your JSON here...}";
String jsonPathExpression = "$...your jsonPath expression here...";
J requestedClass = JsonPath.parse(json).read(jsonPathExpression, YouRequestedClass.class);
Example:
--------
// For better readability: {"store": { "books": [ {"author": "Stephen King", "title": "IT"}, {"author": "Agatha Christie", "title": "The ABC Murders"} ] } }
String json = "{\"store\": { \"books\": [ {\"author\": \"Stephen King\", \"title\": \"IT\"}, {\"author\": \"Agatha Christie\", \"title\": \"The ABC Murders\"} ] } }";
String jsonPathExpression = "$.store.books[?(@.title=='IT')]";
JsonNode jsonNode = JsonPath.parse(json).read(jsonPathExpression, JsonNode.class);
И для справки, вызов 'JsonPath.parse(..)' вернет объект класса 'JsonContent', реализующий некоторые интерфейсы, такие как как ReadContext ', который содержит несколько различных операций чтения (..)', например, показанных выше:
/**
* Reads the given path from this context
*
* @param path path to apply
* @param type expected return type (will try to map)
* @param <T>
* @return result
*/
<T> T read(JsonPath path, Class<T> type);
Надеюсь, что это поможет кому угодно.
Ответ 3
Проверьте API-интерфейс jpath. Это эквивалент xpath для данных JSON. Вы можете читать данные, предоставляя jpath, который будет перемещаться по данным JSON и возвращать запрошенное значение.
Этот Java-класс является реализацией, а также имеет примеры кода о том, как вызвать API.
https://github.com/satyapaul/jpath/blob/master/JSONDataReader.java
Readme -
https://github.com/satyapaul/jpath/blob/master/README.md