Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用javajackson如何将包含映射列表的json映射到javapojo_Java_Json_Jackson - Fatal编程技术网

使用javajackson如何将包含映射列表的json映射到javapojo

使用javajackson如何将包含映射列表的json映射到javapojo,java,json,jackson,Java,Json,Jackson,我已经为这个问题挣扎了几天了 假设我的json响应是: { "ignoreMe": -1, "ignoreMeToo": "Not interested in this", "valuableInfo": [{ "Info1": { "key1": 0.0537, "key2": 0.0759 } }, { "Info2": { "key2": 0.0444,

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

假设我的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;
    }
}

我猜您的错误是,Jackson找不到合适的无参数构造函数来响应到(因为没有)。要克服这个问题,您可以使用和注释。请参阅更改的构造函数:

@JsonCreator
public ResponseDTO(@JsonProperty("valuableInfo") List<Map<String, Double>> valuableInfo){
    this.valuableInfo = valuableInfo;
}
@JsonCreator
公众负责(@JsonProperty(“valuableInfo”)列出valuableInfo){
this.valuableInfo=valuableInfo;
}
代码的其余部分可以保持不变


这只是告诉jackson它应该将名为“valuableInfo”的属性注入该构造函数。

仔细观察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;
}
}
@JsonIgnoreProperties(ignoreUnknown=true)
公众阶级响应{
私人清单价值信息;
@JsonCreator
公众负责(@JsonProperty(“valuableInfo”)列出valuableInfo){
this.valueableInfo=valueableInfo;
}
公共列表getValueableInfo(){
返回valueableInfo;
}
public void setValueableInfo(列表valueableInfo){
this.valueableInfo=valueableInfo;
}
}

对于不带out参数的类,您需要一个公共构造函数。Info1是否有元素列表?意思是“Info1”[{}]或者它只是一个“Info1”{}@ShaunakPatel不,这只是Info1{}很好的答案。遗憾的是,Java不能通过反射轻松检索参数名(因为它需要启用调试选项)。它将避免
@JsonProperty(“valuableInfo”)
声明既冗长又不利于维护。@davidxxx它已经多次困扰我说它不可能,但java就是这样。最好不要自己编写这样的代码,而是让它通过招摇过市之类的方式生成,这几乎可以消除维护问题;“com.fasterxml.jackson.databind.exc.missmatchdinputException:无法反序列化
java.lang.Double
out-START\u对象标记的实例”我认为可能与Map@waqask87在看了你的问题之后,很清楚这是为什么。valuableInfo包含一个对象列表,其中包含一个属性,然后包含一个映射
[{“Info1”:{“key1”:0.0537}]
所以你需要一个
列表
,它让我想吐。因此,取而代之的是,使用mapsIs创建新的POJO。我无法绕过这个临时对象吗@LinoIs这个问题没办法解决吗?我真的只是想要一个列表,然后需要在json中进行更改
@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;
}
}