Проблема: попытка конвертировать 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
Если я правильно понял из быстрого теста, свойство не будет полностью опущено, поэтому, если мне нужно игнорировать некоторые поля в классе более глубокого уровня, мне нужно определить его снова, правильно? –
(Мое предположение кажется правильным после дальнейших испытаний). Проблема в том, что геокодированные WAYpoints не назначаются (равно null), означает ли это (простыми словами), что Jackson lib. считает, что в моей модели нет места для геокодированных Waypoints из JSON и поэтому игнорирует ее установку в null? –
Кажется, что Джексон пытается найти свойство в вашем объекте, которого не существует. Вы должны аннотировать ваши 'geocodeWaypoints' с помощью' @JsonProperty («geocode_waypoints») 'или настроить свой' ObjectMapper' для преобразования символов подчеркивания в случай верблюда. Я уточню свой ответ. – Philipe