使用javajackson如何将包含映射列表的json映射到javapojo
我已经为这个问题挣扎了几天了 假设我的json响应是:使用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,
{
"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;
}
}