2013-02-23 4 views
5

Mam złożone JSON, które próbuję analizować przy użyciu Jackson JSON. Jestem nieco zdezorientowany, jak dostać się do obiektu latLng, aby wyciągnąć wartości lat, lng. Jest to część JSON:Korzystanie z Jackson JSON Parser: Complex JSON?

{ 
    "results": [ 
     { 
      "locations": [ 
       { 
        "latLng": { 
         "lng": -76.85165, 
         "lat": 39.25108 
        }, 
        "adminArea4": "Howard County", 
        "adminArea5Type": "City", 
        "adminArea4Type": "County", 

To, co mam tak daleko w Javie, aby wyciągnąć go:

public class parkJSON 
{ 
    public latLng _latLng; 

    public static class latLng 
    { 
     private String _lat, _lng; 
     public String getLat() { return _lat; } 
     public String getLon() { return _lng; } 
    } 
} 

i

ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally 
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
parkJSON geo = mapper.readValue(parse, parkJSON.class); 

System.out.println(mapper.writeValueAsString(geo)); 
String lat = geo._latLng.getLat(); 
String lon = geo._latLng.getLon(); 
output = lat + "," + lon; 
System.out.println("Found Coordinates: " + output); 

ZDECYDOWANE To jak ja rozwiązano problem, używając modelu drzewa do wykorzystania w przyszłości:

  ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally 
      mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);     
      JsonNode rootNode = mapper.readTree(parse); 
      JsonNode firstResult = rootNode.get("results").get(0); 
      JsonNode location = firstResult.get("locations").get(0); 
      JsonNode latLng = location.get("latLng"); 
      String lat = latLng.get("lat").asText(); 
      String lng = latLng.get("lng").asText(); 
      output = lat + "," + lng; 
      System.out.println("Found Coordinates: " + output); 

Odpowiedz

4

Jeśli naprawdę interesujesz się tą strukturą wejściową, to długie i pełne mapowanie jest prawdopodobnie najmniej dostosowaną do różnych podejść oferowanych przez Jacksona, ponieważ zmusza Cię do pisania klas reprezentujących różne warstwy danych.

Istnieją dwa alternatywne rozwiązania oferowane przez Jacksona, które pozwalają wyodrębnić te pola bez konieczności definiowania tych klas:

  1. The tree model oferuje szereg metod nawigacji przechodzić drzewo i wyodrębnić dane jesteś zainteresował się.
  2. Simple data binding mapuje dokument JSON na mapę lub listę, którą można następnie nawigować metodami oferowanymi przez te kolekcje.

Dokumentacja Jacksona zawiera przykłady obu technik, zastosowanie ich w programie nie powinno być zbyt trudne, należy użyć debuggera do zbadania struktur danych utworzonych przez analizator składni, aby zobaczyć, jak dokument został zamapowany.

+0

Mam to działa przy użyciu metody modelu drzewa –

+0

ObjectMapper mapper = new ObjectMapper(); // może ponownie użyć, udostępnić globalnie mapper.configure (DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); JsonNode rootNode = mapper.readTree (parsowanie); JsonNode firstResult = rootNode.get ("wyniki"). Get (0); Lokalizacja JsonNode = firstResult.get ("locations"). Get (0); JsonNode latLng = location.get ("latLng"); String lat = latLng.get ("lat"). AsText(); String lng = latLng.get ("lng"). AsText(); –

+0

To świetnie :-) Powodzenia w projekcie. – fvu