Основное использование 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