Java 如何配置jackson objectmapper以正确地反序列化到pojo?
我在理解反序列化时应该如何配置objectMapper和pojo时遇到了一些问题。我的Json是由另一个 支持xml和json。它返回一个带有myobject的列表,但Json包含该类型,如下所示:Java 如何配置jackson objectmapper以正确地反序列化到pojo?,java,deserialization,jackson,Java,Deserialization,Jackson,我在理解反序列化时应该如何配置objectMapper和pojo时遇到了一些问题。我的Json是由另一个 支持xml和json。它返回一个带有myobject的列表,但Json包含该类型,如下所示: [ { "myobject": { "somethingcool": "amazing", "contactPersonsForMyObject": [ "test.test@gmail.com"
[
{
"myobject": {
"somethingcool": "amazing",
"contactPersonsForMyObject": [
"test.test@gmail.com",
"test@test.se"
],
"myObjectId": "c85e48730501bfae41e67714c6131b7d"
}
},
{
"myobject": {
"somethingcool": "cool",
"contactPersonsForMyObject": [
"test.test2@gmail.com",
"test@test2.se"
],
"myObjectId": "c85e48730501bfae41e67714cqwerty"
}
}
]
List<Map<String, MyObject>> myObjects = mapper.readValue(json, new TypeReference<List<Map<String, MyObject>>>() {
});
我的班级:
public class MyObject {
private String myObjectId;
private String somethingcool;
private List<String> contactPersonsForMyObject;
public String getMyObjectId() {
return myObjectId;
}
public void setMyObjectId(String myObjectId) {
this.myObjectId = myObjectId;
}
public String getSomethingcool() {
return somethingcool;
}
public void setSomethingcool(String somethingcool) {
this.somethingcool = somethingcool;
}
public List<String> getContactPersonsForMyObject() {
return contactPersonsForMyObject;
}
public void setContactPersonsForMyObject(List<String> contactPersonsForMyObject) {
this.contactPersonsForMyObject = contactPersonsForMyObject;
}
}
这就像地图绘制者不理解额外的“层”。
当序列化以获取此结构时,可以如下配置映射器:mapper.configure(SerializationConfig.Feature.WRAP\u ROOT\u VALUE,true)代码>
那么应该有什么方法来做相反的事情
谢谢大家! 您需要对类型(类)使用@JsonTypeInfo
注释,该注释将包括其他类型信息。在您的例子中,似乎希望包含一个类型id作为属性键
如果是这样,包含方法应该是“作为包装器对象”,并且您还需要定义“myobject”绑定到的类型id——这可以通过为myobject
类添加@JsonTypeName(“myobject”)
来完成(它需要包含在任何具有@JsonTypeInfo
的子类型中,但在本例中,这两个都将被添加到同一个类中)。您的json有一个额外的嵌套级别:您有一个到MyObject的字符串映射列表,而不是一个MyObject列表。您需要这样阅读它:
[
{
"myobject": {
"somethingcool": "amazing",
"contactPersonsForMyObject": [
"test.test@gmail.com",
"test@test.se"
],
"myObjectId": "c85e48730501bfae41e67714c6131b7d"
}
},
{
"myobject": {
"somethingcool": "cool",
"contactPersonsForMyObject": [
"test.test2@gmail.com",
"test@test2.se"
],
"myObjectId": "c85e48730501bfae41e67714cqwerty"
}
}
]
List<Map<String, MyObject>> myObjects = mapper.readValue(json, new TypeReference<List<Map<String, MyObject>>>() {
});
List myObjects=mapper.readValue(json,新类型引用(){
});
或者将生成此json的内容更改为放弃内部映射(IMHO更好)。将List
更改为ArrayList
然后
将以下构造函数添加到MyObject
类
@JsonCreator
public MyObject(@JsonProperty("myObjectId") String myObjectId,
@JsonProperty("somethingcool") String somthingcool,
@JsonProperty("contact") ArrayList<String> contactPersonsForMyObject) {
this.myObjectID = myObjectId;
this.somethingcool = somethingcool;
this.contactPersonsForMyObject = contactPersonsForMyObject;
}
@JsonCreator
公共MyObject(@JsonProperty(“myObjectId”)字符串myObjectId,
@JsonProperty(“somethingcool”)字符串somthingcool,
@JsonProperty(“联系人”)ArrayList ContactPersonFormyObject){
this.myObjectID=myObjectID;
this.somethingcool=somethingcool;
this.contactPersonsForMyObject=contactPersonsForMyObject;
}
并将getter的返回值更改为ArrayList,您需要给它具体的类而不是接口
List<Map<String, MyObject>> myObjects = mapper.readValue(json, new TypeReference<ArrayList<HashMap<String, MyObject>>>() {
});
List myObjects=mapper.readValue(json,新类型引用(){
});
请您详细说明您的答案,也许是一些代码示例?我发现这方面的文档很难理解。您可能想在jackson用户列表中询问这一点;此外,Google可以找到合适的文章(从fasterxml jackson wiki、cowtowncoder.com博客),如果@JsonTypeInfo的javadocs不够清晰。1.是的,我知道,您的示例就像实现一个包装器。这不是我想要做的。2.我不能放弃内部映射,因为我没有对应用程序的控制权
List<Map<String, MyObject>> myObjects = mapper.readValue(json, new TypeReference<ArrayList<HashMap<String, MyObject>>>() {
});