2011-12-05 17 views
6

Mój ciąg JSON ma zagnieżdżone wartości.Java JSON-Jackson-Nested Elements

Coś

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

Chcę wartość retweet_count.

Używam Jackson.

Poniższy kod wyświetla "{retweet_count=78}", a nie 78. Zastanawiam się, czy mogę uzyskać wartości zagnieżdżone w sposób, w jaki PHP to robi, tj. status->retweet_count. Dzięki.

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

Należy się spodziewać: va; ue "statusu" to mapa, prawda? Musisz tylko wywołać "get()" jeszcze raz z "retweet_count". Jednak zgadzam się z jedną z odpowiedzi, która sugeruje użycie 'readTree()' zamiast tego, aby uzyskać 'JsonNode' - o wiele łatwiejszy do przemierzania. – StaxMan

Odpowiedz

9

Spróbuj czegoś takiego. Jeśli użyjesz JsonNode, twoje życie będzie łatwiejsze.

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

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

prawdopodobnie można zrobić System.out.println(fwers.get(0).get("status").get("retweet_count"));

Edit 1:

Zmień

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

do

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

a następnie wykonaj System.out.println(fwers.get(0).get("status").get("retweet_count"));

Nie masz mapy par, masz parę Map z <String, Map<String, Object>> parami.

Edit 2:

Dobrze rozumiem. Masz więc listę map. I na pierwszej mapie na liście masz parę kv, w której wartość jest liczbą całkowitą, i inną parę kv, gdzie wartość jest inną mapą. Kiedy mówisz, że masz listę map map, skarżysz się, ponieważ para kv z wartością int nie jest mapą (to tylko int). Musisz albo wykonać wszystkie mapy par kv (zmienić int na mapę), a następnie użyć powyższych zmian. Możesz też użyć oryginalnego kodu, ale rzucić obiekt na mapę, gdy wiesz, że jest to mapa.

Więc spróbuj tego:

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

Próbowałem tego, to nie działa. Get ("status") jest normalnym obiektem – Mob

+1

Zobacz moje zmiany, proszę! –

+0

Więcej błędów bro,: 'Nie można deserializować wystąpienia java.util.LinkedHashMap z tokena VALUE_NUMBER_INT' – Mob

12

Jeśli znasz podstawowe struktury danych jesteś odzyskiwaniem, ma sens do reprezentowania go prawidłowo. Otrzymujesz wszelkiego rodzaju drobiazgi, takie jak bezpieczeństwo typu;)

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); 
Powiązane problemy