使用Java Jackson如何将包含映射列表的json映射到java pojo

时间:2018-07-27 11:06:19

标签: java json jackson

我已经为这个问题苦苦挣扎了几天。

让我们说我的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)

2 个答案:

答案 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;
}
}