gpt4 book ai didi

java - 如何使用 Jackson 将 JSONArray-to-List 中不同类型的对象映射?

转载 作者:行者123 更新时间:2023-12-01 14:35:54 24 4
gpt4 key购买 nike

我有一个 JSONObject 类似:

  {
"name": "John",
"details": [
[
"phone",
123456789
],
[
"address",
"abcdef"
]
]
}

我正在尝试将上面的 jSON 映射到以下对象:

 @JsonIgnoreProperties(ignoreUnknown = true)
public class Employee{
String name;
List<List<DetailItem>> details;


public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<List<DetailItem>> getDetails() {
return details;
}
public void setDetails(List<List<DetailItem>> details) {
this.details = details;
}

}


@JsonSubTypes({
@JsonSubTypes.Type(value=String.class),
@JsonSubTypes.Type(value=Integer.class)
})
public class DetailItem{

}

映射使用:

     ObjectMapper mapper = new ObjectMapper();
mapper.readValue(instream, Employee.class)

异常(exception):

com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, DetailItem] from String value; no single-String constructor/factory method (through reference chain: Employe["details"])

我正在尝试进行多态反序列化,因为 DetailItemStringInteger

谢谢

最佳答案

这根本不是多态反序列化的工作原理!您忽略了多态性的定义,并试图在不相关的类之间神奇地创建关系。即使没有明确强制执行,用 @JsonSubTypes 注释的类型也应该是每个定义的 @Type 的父类。

@JsonSubTypes({
@Type(value=String.class), // String is not a subclass of DetailItem!
@Type(value=Integer.class) // Integer is not a subclass of DetailItem!
})
public class DetailItem{
}

根本问题在于 JSON 输入的设计非常粗劣。我什至不会问为什么每个 detail 属性都被非规范化并存储到单独的数组中,但我强烈建议将格式修复为更合理的格式。例如:

{
"name": "John",
"details": {
"phone" : 123456789,
"address" : "abcedf",
}
}

上面的内容可以简单地反序列化为以下对象:

class Employee {
private Sting name;
private Map<String, Object> details;

// constructor, getters/setters
}

如果您坚持使用当前格式,请将 List<List<DetailItem>> 更改为 List<List<Object>>implement a custom deserializer

关于java - 如何使用 Jackson 将 JSONArray-to-List<MyObject> 中不同类型的对象映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16491220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com