validar playground online language java json jsonpath

playground - Uso básico de JSONPath en Java



jsonpath spring (4)

Tengo JSON como una cadena y un JSONPath como una cadena. Me gustaría consultar el JSON con la ruta JSON, obteniendo el JSON resultante como una cadena.

Supongo que el camino del json de Jayway es el estándar . Sin embargo, la API en línea no tiene mucha relación con la biblioteca real que obtiene de Maven . Sin embargo, la versión de GrepCode coincide aproximadamente.

Parece que debería ser capaz de hacer:

String originalJson; //these are initialized to actual data String jsonPath; String queriedJson = JsonPath.<String>read(originalJson, jsonPath);

El problema es que la read devuelve lo que parece más apropiado en función de lo que JSONPath realmente encuentra (por ejemplo, una List<Object> , String , double , etc.), por lo que mi código lanza una excepción para ciertas consultas. Parece bastante razonable suponer que habría alguna forma de consultar a JSON y recuperar a JSON; ¿alguna sugerencia?


Definitivamente existe una forma de consultar a Json y recuperar a Json usando JsonPath. Vea el ejemplo a continuación:

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);

La salida de lo anterior será Json interior.

[{"código postal": {"distrito": "Ghaziabad", "pin": 201001, "prepago": "Y", "efectivo": "Y", "recolección": "Y", "réplica": " N "," cod ":" Y "," is_oda ":" N "," sort_code ":" GB "," state_code ":" UP "}}]

Ahora, cada par de nombre / valor individual se puede analizar mediante la iteración de la Lista (JsonNode) que obtuvimos anteriormente.

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 ); }

La salida será:

pin :: 201001 distrito :: Ghaziabad

Dependiendo del Json que esté intentando analizar, puede decidir si buscar una Lista o solo un valor de Cadena / Largo.

Espero que te ayude a resolver tu problema.



La API de Java JsonPath encontrada en jayway JsonPath podría haber cambiado un poco desde todas las respuestas / comentarios anteriores. Documentación también. Simplemente siga el enlace anterior y lea el README.md , que contiene una documentación clara de uso, IMO.

Básicamente, a partir de la última versión actual 2.2.0 de la biblioteca, hay algunas maneras diferentes de lograr lo que se ha solicitado aquí, como:

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);

Y para referencia, llamar a ''JsonPath.parse (..)'' devolverá un objeto de la clase '' JsonContent '' implementando algunas interfaces como '' ReadContext '', que contiene varias operaciones diferentes de ''lectura (..)'', como la que se muestra encima:

/** * 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);

Espero que esto ayude a alguien.


Para aquellos de ustedes que se preguntan por qué algunas de estas respuestas antiguas no funcionan, puede aprender mucho de los casos de prueba .

A partir de septiembre de 2018, aquí le indicamos cómo puede obtener los resultados de Jackson JsonNode:

Configuration jacksonConfig = Configuration.builder() .mappingProvider( new JacksonMappingProvider() ) .jsonProvider( new JacksonJsonProvider() ) .build(); JsonNode node = JsonPath.using( jacksonConfig ).parse(jsonString);