Jackson readValue映射到重载的java类问题

时间:2011-07-12 08:56:34

标签: json jackson

我有一些JSON,其中一个键具有三个值之一:int,string或json对象。使用下面的代码片段,我可以在它是int或字符串时映射该字段,但在它是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'的合适的构造函数

感谢。亚历

2 个答案:

答案 0 :(得分:1)

可能有用的是标记带有@JsonCreator的JSONObject的构造函数,但不要为单个参数添加@JsonProperty。在这种情况下,传入的JSON绑定到该参数的类型(在本例中为JSONObject,但您也可以使用Map),并传递给构造函数。 由于对单字符串/ int / long-argument构造函数的特殊处理,重载仍然有效。

我不确定这是否是最干净的解决方案;实现自定义反序列化器可能是最干净的。但它应该有用。

答案 1 :(得分:0)

如果你的代码是你想要的,你的json应该是这样的:

{"value":{"slidervalue":1,"voicevalue":"aa","geovalue":{"lat":53.990615,"lng":-1.53911170000003,"addr":"Harrogate, North Yorkshire, UK"}}}