2011-12-05 32 views
6

Mi cadena JSON tiene valores anidados.Java JSON -Jackson- Elementos anidados

Algo así como

"[{"listed_count":1720,"status":{"retweet_count":78}}]"

Quiero que el valor de la retweet_count.

Estoy usando Jackson.

El siguiente código muestra "{retweet_count=78}" y no 78. Me pregunto si puedo obtener valores anidados del modo en que PHP lo hace, es decir, status->retweet_count. Gracias.

import java.io.IOException; 
import java.util.List; 
import java.util.Map; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.type.TypeReference; 

public class tests { 
public static void main(String [] args) throws IOException{ 
    ObjectMapper mapper = new ObjectMapper(); 
    List <Map<String, Object>> fwers = mapper.readValue("[{\"listed_count\":1720,\"status\":{\"retweet_count\":78}}]]", new TypeReference<List <Map<String, Object>>>() {}); 
    System.out.println(fwers.get(0).get("status")); 

    } 
} 
+0

Eso es de esperar: va; ue of 'status' is a Map is not it is? Solo tienes que llamar a 'get()' una vez más con "retweet_count". Sin embargo, estoy de acuerdo con una de las respuestas que sugiere el uso de 'readTree()' en su lugar, para obtener un 'JsonNode', mucho más fácil de recorrer. – StaxMan

Respuesta

9

Prueba algo así. Si usas JsonNode, tu vida será más fácil.

JsonNode node = mapper.readValue("[{\"listed_count\":1720,\"status\":{\"retweet_count\":78}}]]", JsonNode.class); 

System.out.println(node.findValues("retweet_count").get(0).asInt()); 
2

es probable que pueda hacer System.out.println(fwers.get(0).get("status").get("retweet_count"));

Edición 1:

Cambio

List <Map<String, Object>> fwers = mapper.readValue(..., new TypeReference<List <Map<String, Object>>>() {}); 

a

List<Map<String, Map<String, Object>>> fwers = mapper.readValue(..., new TypeReference<List<Map<String, Map<String, Object>>>>() {}); 

y luego hacer System.out.println(fwers.get(0).get("status").get("retweet_count"));

No tiene un Mapa de pares, tiene un Mapa de <String, Map<String, Object>> pares.

Editar 2:

Alright I get it. Entonces tienes una lista de mapas. Y en el primer mapa de la lista, tiene un par de kv donde el valor es un entero, y otro par de kv donde el valor es otro mapa. Cuando dices que tienes una lista de mapas de mapas, se queja porque el par kv con el valor int no es un mapa (es solo un int). Entonces, o tienes que hacer todos tus mapas de kv pairs (cambiar ese int a un mapa) y luego usar mis ediciones anteriores. O puede usar su código original, pero puede enviar el Objeto a un Mapa cuando sepa que es un Mapa.

Así que trate esto:

Map m = (Map) fwers.get(0).get("status"); 
System.out.println(m.get("retweet_count")); 
+0

He intentado esto, pero no funciona. El get ("estado") es un objeto normal – Mob

+1

¡Ver mis ediciones, por favor! –

+0

Más errores bro,: 'No se puede deserializar la instancia de java.util.LinkedHashMap fuera de VALUE_NUMBER_INT token' – Mob

12

Si conoce la estructura básica de los datos que está recuperando, tiene sentido para representar adecuadamente. Obtienes todo tipo de detalles como tipo de seguridad;)

public static class TweetThingy { 
    public int listed_count; 
    public Status status; 

    public static class Status { 
     public int retweet_count; 
    } 
} 

List<TweetThingy> tt = mapper.readValue(..., new TypeReference<List<TweetThingy>>() {}); 
System.out.println(tt.get(0).status.retweet_count); 
Cuestiones relacionadas