我已经为这个问题苦苦挣扎了几天。
让我们说我的json响应是:
{
"ignoreMe": -1,
"ignoreMeToo": "Not interested in this",
"valuableInfo": [{
"Info1": {
"key1": 0.0537,
"key2": 0.0759
}
}, {
"Info2": {
"key2": 0.0444,
"key4": 0.2345
}
}
]}
通过此响应,我希望能够映射到我的自定义pojo对象,该对象应如下所示;
@JsonIgnoreProperties(ignoreUnknown = true)
public class ResponseDTO{
private List<Map<String, Double>> valuableInfo;
public ResponseDTO(List<Map<String, Double>> valuableInfo) {
this.valuableInfo = valuableInfo;
}
public List<Map<String, Double>> getvaluableInfo() {
return valuableInfo;
}
public void setvaluableInfo(List<Map<String, Double>> valuableInfo) {
this.valuableInfo = valuableInfo;
}
}
我如何设置我的映射器以仅使用此操作即可完成
mapper.readValue(jsonResponse, ResponseDTO.class)
答案 0 :(得分:5)
我猜你的错误是,杰克逊找不到ResponseDTO
的合适的无参数构造函数(因为没有)。为了克服这个问题,您可以使用@JsonCreator
和@JsonProperty
批注。查看更改后的构造函数:
@JsonCreator
public ResponseDTO(@JsonProperty("valuableInfo") List<Map<String, Double>> valuableInfo){
this.valuableInfo = valuableInfo;
}
其余代码可以保持不变。
这只是告诉杰克逊,应将名称为"valuableInfo"
的属性注入该构造函数中。
答案 1 :(得分:0)
仔细观察您的json。 valuableInfo
此处包含对象列表。每个对象都包含Map
@JsonIgnoreProperties(ignoreUnknown = true)
public class ResponseDTO{
private List<Map<String, Map<String, Double>>> valueableInfo;
@JsonCreator
public ResponseDTO(@JsonProperty("valuableInfo") List<Map<String, Map<String, Double>>> valuableInfo){
this.valueableInfo = valuableInfo;
}
public List<Map<String, Map<String, Double>>> getValueableInfo() {
return valueableInfo;
}
public void setValueableInfo(List<Map<String, Map<String, Double>>> valueableInfo) {
this.valueableInfo = valueableInfo;
}
}