pass convert java json jackson gson

convert - pass java object to json



Valor de lectura de clave anidada en JSON con Java(Jackson) (4)

Con el modelo de árbol de Jackson ( JsonNode ), tiene métodos de acceso "literales" (''get''), que devuelven un valor null para el valor perdido, y JsonNode "seguros" (''ruta de acceso''), que le permiten atravesar nodos "faltantes". Así por ejemplo:

JsonNode root = mapper.readTree(inputSource); int h = root.path("response").path("history").getValueAsInt();

que devolvería el valor en la ruta dada o, si falta la ruta, 0 (valor predeterminado)

Pero más convenientemente, puedes usar la expresión de puntero JSON:

int h = root.at("/response/history").getValueAsInt();

También hay otras formas, y a menudo es más conveniente modelar su estructura como Plain Old Java Object (POJO). Tu contenido podría caber algo como:

public class Wrapper { public Response response; } public class Response { public Map<String,Integer> features; // or maybe Map<String,Object> public List<HistoryItem> history; } public class HistoryItem { public MyDate date; // or just Map<String,String> // ... and so forth }

y si es así, atravesarías los objetos resultantes como cualquier objeto de Java.

Soy un nuevo programador de Java que viene de un fondo en Python. Tengo datos meteorológicos que se recopilan / devuelven como JSON con claves anidadas, y no entiendo cómo se extraen los valores en esta situación. Estoy seguro de que esta pregunta se ha hecho antes, pero juro que he buscado mucho en Google y parece que no puedo encontrar una respuesta. En este momento estoy usando json-simple, pero traté de cambiarme a Jackson y aún no pude averiguar cómo hacerlo. Ya que Jackson / Gson parecen ser las bibliotecas más utilizadas, me encantaría ver un ejemplo utilizando una de esas bibliotecas. A continuación se muestra una muestra de los datos, seguida del código que he escrito hasta ahora.

{ "response": { "features": { "history": 1 } }, "history": { "date": { "pretty": "April 13, 2010", "year": "2010", "mon": "04", "mday": "13", "hour": "12", "min": "00", "tzname": "America/Los_Angeles" }, ... } }

Función principal

public class Tester { public static void main(String args[]) throws MalformedURLException, IOException, ParseException { WundergroundAPI wu = new WundergroundAPI("*******60fedd095"); JSONObject json = wu.historical("San_Francisco", "CA", "20100413"); System.out.println(json.toString()); System.out.println(); //This only returns 1 level. Further .get() calls throw an exception System.out.println(json.get("history")); } }

La función ''histórica'' llama a otra función que devuelve un JSONObject

public static JSONObject readJsonFromUrl(URL url) throws MalformedURLException, IOException, ParseException { InputStream inputStream = url.openStream(); try { JSONParser parser = new JSONParser(); BufferedReader buffReader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8"))); String jsonText = readAll(buffReader); JSONObject json = (JSONObject) parser.parse(jsonText); return json; } finally { inputStream.close(); } }


Echa un vistazo a ObjectMapper de Jackson. Puede crear una clase para modelar su JSON y luego usar el método readValue de ObjectMapper para ''deserializar'' su cadena JSON en una instancia de su clase modelo. Y viceversa.


Prueba la API de jpath. Es equivalente a xpath para datos JSON. Puede leer los datos proporcionando el jpath que atravesará los datos JSON y devolverá el valor solicitado.

Esta clase de Java es la implementación y tiene códigos de ejemplo sobre cómo llamar a las API.

https://github.com/satyapaul/jpath/blob/master/JSONDataReader.java

Léame -

https://github.com/satyapaul/jpath/blob/master/README.md

Ejemplo:

Datos JSON:

{ "data": [{ "id": "13652355666_10154605514815667", "uid": "442637379090660", "userName": "fanffair", "userFullName": "fanffair", "userAction": "recommends", "pageid": "usatoday", "fanPageName": "USA TODAY", "description": "A missing Indonesian man was found inside a massive python on the island of Sulawesi, according to local authorities and news reports. ", "catid": "NewsAndMedia", "type": "link", "name": "Indonesian man swallowed whole by python", "picture": "https:////external.xx.fbcdn.net//safe_image.php?d=AQBQf3loH5-XP6hH&w=130&h=130&url=https%3A%2F%2Fwww.gannett-cdn.com%2F-mm-%2F1bb682d12cfc4d1c1423ac6202f4a4e2205298e7%2Fc%3D0-5-1821-1034%26r%3Dx633%26c%3D1200x630%2Flocal%2F-%2Fmedia%2F2017%2F03%2F29%2FUSATODAY%2FUSATODAY%2F636263764866290525-Screen-Shot-2017-03-29-at-9.27.47-AM.jpg&cfs=1&_nc_hash=AQDssV84Gt83dH2A", "full_picture": "https:////external.xx.fbcdn.net//safe_image.php?d=AQBQf3loH5-XP6hH&w=130&h=130&url=https%3A%2F%2Fwww.gannett-cdn.com%2F-mm-%2F1bb682d12cfc4d1c1423ac6202f4a4e2205298e7%2Fc%3D0-5-1821-1034%26r%3Dx633%26c%3D1200x630%2Flocal%2F-%2Fmedia%2F2017%2F03%2F29%2FUSATODAY%2FUSATODAY%2F636263764866290525-Screen-Shot-2017-03-29-at-9.27.47-AM.jpg&cfs=1&_nc_hash=AQDssV84Gt83dH2A", "message": "Akbar Salubiro was reported missing after he failed to return from harvesting palm oil.", "link": "http:////www.usatoday.com//story//news//nation-now//2017//03//29//missing-indonesian-man-swallowed-whole-reticulated-python//99771300//", "source": "", "likes": { "summary": { "total_count": "500" } }, "comments": { "summary": { "total_count": "61" } }, "shares": { "count": "4" } }] }

Fragmento de código:

String jPath = "/data[Array][1]/likes[Object]/summary[Object]/total_count[String]"; String value = JSONDataReader.getStringValue(jPath, jsonData);


Utilizar Jsonpath

Integer h = JsonPath.parse (json) .read ("$. Response.repository.history", Integer.class);