2013-09-05 3 views
1

У меня возникла проблема с использованием геокодирования google api. Например, с этим url http://maps.google.com/maps/api/geocode/json?latlng=47.3195254,5.0430687&sensor=true, я хочу разобрать json с jackson 2, чтобы создать POJO.Jackson 2 deserialization

Так что мой класс

public class GeocoderResult { 

@JsonProperty("results") private List<GeocoderGoog> geocoder; 
@JsonProperty("status") private String status; 

public List<GeocoderGoog> getGeocoder() { 
    return geocoder; 
} 
public String getStatus() { 
    return status; 
} 

} 

десериализации JSON, я использую

HttpURLConnection connection = (HttpURLConnection) new URL(baseUrl).openConnection(); 
ObjectMapper mapper = new ObjectMapper(); 
// disable exceptions when there is unknown properties 
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); 
int statusCode = connection.getResponseCode(); 
Log.d(Constants.D_TAG, "Status : "+statusCode); 
if (statusCode == HttpURLConnection.HTTP_OK) { // 200 
    InputStream is = new BufferedInputStream(connection.getInputStream()); 
    status = (Status) mapper.readValue(is, GeocoderResult.class); 
} 

Я следующее сообщение об ошибке:

09:38:42.737 Thread-24889 An exception occurred during request network execution :Unexpected close marker '}': expected ']' (for ROOT starting at [Source: [email protected]; line: 1, column: 0])          
at [Source: [email protected]; line: 2, column: 14] 
com.fasterxml.jackson.core.JsonParseException: Unexpected close marker '}': expected ']' (for ROOT starting at [Source: [email protected]; line: 1, column: 0]) 

Я не понимаю, где проблема ...

ps: Я использую jackson-core, jackson-databind и jackson-annotations. 2.1.4

+0

JSON, который вы получаете, недействителен - некоторые материалы отсутствуют, скорее всего. Не имеет ничего общего с привязкой данных, исключение происходит прямо из потокового анализатора. – StaxMan

+0

Это может быть проблема с версией jackson? – mrroboaat

+0

Нет. Прочтите сообщение об исключении. Несовместимость версий дает довольно четкие ошибки при загрузке классов. Это указывает на сломанный вход JSON - почему это так, я не могу спекулировать. Вы можете справиться с этим, предварительно прочитав и буферизируя контент, затем передав его парсеру - и, возможно, запустив вход для поиска неисправностей. – StaxMan

ответ

3

Я поклонник Джексона, и я могу сказать, что вам стало интересно. Я использовал URL, который вы выставили, и запустил его, как показано ниже. Используется текущая версия API: 2.2.3

классы Модель:

GeocoderResult

public class GeocoderResult { 

    @JsonProperty("results") 
    private ArrayList<GeocoderGoog> geocoder; 

    @JsonProperty("status") 
    private String status; 

    public ArrayList<GeocoderGoog> getGeocoder() { 
     return geocoder; 
    } 

    public String getStatus() { 
     return status; 
    } 
} 

GeocoderGoog

public class GeocoderGoog { 

    @JsonProperty("address_components") 
    private ArrayList<AddressComponent> addressComponents; 

    @JsonProperty("formatted_address") 
    private String formattedAddress; 

    private ArrayList<String> types; 

    private Geometry geometry; 

    public ArrayList<AddressComponent> getAddressComponents() { 
     return addressComponents; 
    } 

    public String getFormattedAddress() { 
     return formattedAddress; 
    } 

    public ArrayList<String> getTypes() { 
     return types; 
    } 

    public Geometry getGeometry() { 
     return geometry; 
    } 

} 

AddressComponent

public class AddressComponent { 
    @JsonProperty("long_name") 
    private String longName; 

    @JsonProperty("short_name") 
    private String shortName; 

    private ArrayList<String> types; 

    public String getLongName() { 
     return longName; 
    } 

    public String getShortName() { 
     return shortName; 
    } 

    public ArrayList<String> getTypes() { 
     return types; 
    } 

} 

Координаты используется в других классах

public class Coordinates { 
    private double lat; 
    private double lng; 

    public double getLat() { 
     return lat; 
    } 

    public void setLat(double lat) { 
     this.lat = lat; 
    } 

    public double getLng() { 
     return lng; 
    } 

    public void setLng(double lng) { 
     this.lng = lng; 
    } 

} 

и Geometry с Viewport:

public class Geometry { 
    private Coordinates location; 

    @JsonProperty("location_type") 
    private String locationType; 

    private ViewPort viewport; 

    public Coordinates getLocation() { 
     return location; 
    } 

    public String getLocationType() { 
     return locationType; 
    } 

    public ViewPort getViewport() { 
     return viewport; 
    } 

    public static class ViewPort { 
     private Coordinates northeast; 
     private Coordinates southwest; 

     public Coordinates getNortheast() { 
      return northeast; 
     } 

     public Coordinates getSouthwest() { 
      return southwest; 
     } 

    } 
} 

и обернуть его - для меня это работало с первой попытки:

protected void performJackson() { 
    new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       String baseUrl = "http://maps.google.com/maps/api/geocode/json?latlng=47.3195254,5.0430687&sensor=true"; 
       HttpURLConnection connection = (HttpURLConnection) new URL(baseUrl).openConnection(); 
       ObjectMapper mapper = new ObjectMapper(); 
       // disable exceptions when there is unknown properties 
       mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); 
       int statusCode = connection.getResponseCode(); 
       Log.d("SJackson", "Status : " + statusCode); 
       if (statusCode == HttpURLConnection.HTTP_OK) { // 200 
        InputStream is = new BufferedInputStream(connection.getInputStream()); 
        GeocoderResult result = mapper.readValue(is, GeocoderResult.class); 
        Log.d("SJackson", "Done: " + (result != null)); 
       } 
      } catch (Exception ex) { 
       Log.e("SJackson", null, ex); 
      } 

      return null; 
     } 
    }.execute(); 
} 
+0

Почему класс «Координаты» не аннотируется? – mrroboaat

+0

Вам не нужно комментировать класс ... вам нужно аннотировать экземпляры классов – gunar

+0

Я имею в виду, это должно быть '@JsonProperty (« lat ») private double lat' и' @JsonProperty («lng») private double lng ', не так ли? Кроме того, я должен использовать ArrayList вместо List? – mrroboaat

Смежные вопросы