Джексон readValue сопоставление с проблемой перегруженного Java-класса - PullRequest
0 голосов
/ 12 июля 2011

У меня есть какой-то JSON, где один из ключей имеет одно из трех значений: int, строка или объект json. Используя приведенный ниже фрагмент, я могу отобразить это поле, когда оно является целым или строковым, но не получится, если это объект json. Куда я иду не так? Что мне делать?

Ключ значения JSON выглядит следующим образом:

"value": 51,

или

"value": 51,

или (и вот тут у меня проблемы)

"value": {"lat": 53.990614999999998, "lng": -1.5391117000000301, "addr": "Harrogate, North Yorkshire, UK"}


public class Test {

public Test() {
}

public static class Value {
public int slidervalue;
public String voicevalue;
public GeoValue geovalue;  // problem

public Value(int  value) {
   this.slidervalue = value
}

public Value(String  value) { 
this.voicevalue = value; 
}

public Value(JSONObject  value) { 
    JSONObject foo = value; // this is never reached

this.geovalue = value; // and how would this work so as map value to a GeoValue? 
}

private static class GeoValue {
private double _lat;
private double _lng;
private String _addr;

public float getLat() {  
    return (float)_lat;
    }
public void setLat(float lat) { 
    _lat = (double)lat; 
    }
public float getLng() { return (float)_lng;}
public void setLng(float lng) { _lng = (double)lng; }

public String getAddr() { return _addr;}
public void setAddr(String addr) { _addr = addr; }
}

} // end of Value class

public Value getValue() { return _value;}
public void setValue(Value value) { 
_value = value; 
}
} //end of Test class

и это используется так:

ObjectMapper mapper = new ObjectMapper();
instance = mInstances.getJSONObject(i).toString();
Test testinstance = mapper.readValue(instance, Test.class);


public class Test {

public Test() {
}

public static class Value {
public int slidervalue;
public String voicevalue;
public GeoValue geovalue;  // problem

public Value(int  value) {
   this.slidervalue = value
}

public Value(String  value) { 
this.voicevalue = value; 
}

public Value(JSONObject  value) { 
    JSONObject foo = value; // this is never reached

this.geovalue = value; // and how would this work so as map value to a GeoValue? 
}

private static class GeoValue {
private double _lat;
private double _lng;
private String _addr;

public float getLat() {  
    return (float)_lat;
    }
public void setLat(float lat) { 
    _lat = (double)lat; 
    }
public float getLng() { return (float)_lng;}
public void setLng(float lng) { _lng = (double)lng; }

public String getAddr() { return _addr;}
public void setAddr(String addr) { _addr = addr; }
}

} // end of Value class

public Value getValue() { return _value;}
public void setValue(Value value) { 
_value = value; 
}
} //end of Test class

и это используется так:

ObjectMapper mapper = new ObjectMapper();
instance = mInstances.getJSONObject(i).toString();
Test testinstance = mapper.readValue(instance, Test.class);

Сбой JSONMappingException: не найден подходящий конструктор для типа ... 'value'

Спасибо. Alex

Ответы [ 2 ]

1 голос
/ 13 июля 2011

Что может сработать, так это то, что вы помечаете конструктор, который принимает JSONObject, с помощью @JsonCreator, но НЕ добавляете @JsonProperty для одного параметра. В этом случае входящий JSON привязывается к типу этого параметра (в данном случае JSONObject, но вы также можете использовать Map) и передается в конструктор. Перегрузка все еще работает из-за специальной обработки для однострочного / int / long-аргумента конструктора.

Я не уверен, что это самое чистое решение; это может быть самым чистым, просто реализовать собственный десериализатор. Но это должно работать.

0 голосов
/ 12 июля 2011

Если ваш код соответствует вашему желанию, ваш json должен выглядеть следующим образом:

{"value":{"slidervalue":1,"voicevalue":"aa","geovalue":{"lat":53.990615,"lng":-1.53911170000003,"addr":"Harrogate, North Yorkshire, UK"}}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...