2015-12-02 4 views
0

Проблема: попытка конвертировать JSON из http-запроса (Google Directions) в POJO (просто мои собственные классы). У меня уже есть «root» класс «GoogleGeoCodeResponse» (GGCR далее в тексте, содержащий некоторые поля верхнего уровня, такие как статус, маршруты и т. Д.), А внутри него есть другие (маршруты содержат этот класс и т. Д.). Я получаюGoogle Direction JSON to POJO (Jackson)

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "geocoded_waypoints" (class Main.GoogleGeoCodeResponse.GoogleGeoCodeResponse), not marked as ignorable (3 known properties: "status", "geocodedWaypoints", "routes"]) 
at [Source: java.io[email protected]; line: 2, column: 28] (through reference chain: Main.GoogleGeoCodeResponse.GoogleGeoCodeResponse["geocoded_waypoints"]) 

при попытке преобразовать с помощью ggcr = mapper.readValue(json, GoogleGeoCodeResponse.class); (JSON является String) даже с @JsonIgnoreProperties(ignoreUnknown = true) в классе GGCR.

К настоящему времени я полностью застрял, и любые идеи будут оценены. Получатели и сеттеры определены только для GGCR, поля являются частными в GGCR и общедоступны в других классах, получают/задают - общедоступны.

EDIT: Основной класс:

public class Main { 
public static void main(String[] args) { 
    String json=""; 
    String origin = "Manhattan+New+York+USA"; 
    String destination = "Newark+New+YorkUSA"; 
    String mode="bicycling"; 
    try { 
     URL url = new URL("https://maps.googleapis.com/maps/api/directions/json?origin="+origin+"&destination="+destination+"&mode="+mode); 
     URLConnection yc = url.openConnection(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream())); 
     String inputLine; 
     while ((inputLine = in.readLine()) != null) { 
      json+=inputLine+"\n"; 
     } 
     in.close(); 
    } 
    catch (Exception e) 
    { 
     System.out.println(e.toString()); 
    } 

    GoogleGeoCodeResponse ggcr=null; 
    ObjectMapper mapper = new ObjectMapper(); 
    try { 
     ggcr = mapper.readValue(json, GoogleGeoCodeResponse.class); 
    } 
    catch(Exception e){ 
     System.out.println(e.toString()); 
    } 
    if (ggcr!=null) 
    { 
     System.out.println("Status: " + ggcr.getStatus()); 
    } 
} 

или здесь http://pastebin.com/pEeqn4f2

GGCR:

public class GoogleGeoCodeResponse { 

@JsonIgnoreProperties(ignoreUnknown = true) 
private String status; 
private GeocodedWaypoint[] geocodedWaypoints; 
private Route[] routes; 
public String getStatus() { 
    return status; 
} 

public void setStatus(String status) { 
    this.status = status; 
} 

public GeocodedWaypoint[] getGeocodedWaypoints() { 
    return geocodedWaypoints; 
} 

public void setGeocodedWaypoints(GeocodedWaypoint[] geocodedWaypoints) { 
    this.geocodedWaypoints = geocodedWaypoints; 
} 

public Route[] getRoutes() { 
    return routes; 
} 

public void setRoutes(Route[] routes) { 
    this.routes = routes; 
} 

или здесь http://pastebin.com/Fs5DYPSY

ответ

1

Вы должны поместить @JsonIgnoreProperties(ignoreUnknown = true) аннотаций в верхней части вашего CLA песчаники Это аннотация на уровне класса.

@JsonIgnoreProperties(ignoreUnknown = true) 
public class GoogleGeoCodeResponse { 

private String status; 
private GeocodedWaypoint[] geocodedWaypoints; 
private Route[] routes; 

... 

В вашем случае кажется, что Джексон пытается сопоставить поле JSON с несуществующим свойством. Вы можете исправить это двумя различными способами:

Использование annotattion

@JsonProperty("geocoded_waypoints") 
private GeocodedWaypoint[] geocodedWaypoints; 

Или настройке ObjectMapper:

objectMapper.setPropertyNamingStrategy(
    PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES); 

Я бы с конфигурацией картографа, поскольку API вы используете использование подчеркивания с помощью по умолчанию для имен полей. Таким образом, вы можете избежать аннотации каждого члена класса с помощью @JsonProperty.

+0

Если я правильно понял из быстрого теста, свойство не будет полностью опущено, поэтому, если мне нужно игнорировать некоторые поля в классе более глубокого уровня, мне нужно определить его снова, правильно? –

+0

(Мое предположение кажется правильным после дальнейших испытаний). Проблема в том, что геокодированные WAYpoints не назначаются (равно null), означает ли это (простыми словами), что Jackson lib. считает, что в моей модели нет места для геокодированных Waypoints из JSON и поэтому игнорирует ее установку в null? –

+0

Кажется, что Джексон пытается найти свойство в вашем объекте, которого не существует. Вы должны аннотировать ваши 'geocodeWaypoints' с помощью' @JsonProperty («geocode_waypoints») 'или настроить свой' ObjectMapper' для преобразования символов подчеркивания в случай верблюда. Я уточню свой ответ. – Philipe