我在解析反序列化时应该如何配置objectMapper和pojo时遇到一些问题。我的Json是由另一个应用程序创建的 支持xml和json。它返回一个包含myobject的列表,但Json包含类型,如下所示:
[
{
"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"
}
}
]
我的课程:
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;
}
}
但在做的时候:
List<MyObject> myObjects = mapper.convertValue(rootNode, new TypeReference<List<MyObject>>() {});
我得到一个例外陈述:
java.lang.IllegalArgumentException: Unrecognized field "myobject" (Class com.domain.MyObject), not marked as ignorable
at [Source: N/A; line: -1, column: -1] (through reference chain: com.domain.MyObject["myobject"])
就像映射器不理解额外的“层”一样。
在序列化以获得此结构时,可以像下面这样配置映射器:mapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);
所以应该以某种方式反过来?
谢谢!
答案 0 :(得分:4)
你需要给它具体的类而不是接口。所以
List<Map<String, MyObject>> myObjects = mapper.readValue(json, new TypeReference<ArrayList<HashMap<String, MyObject>>>() {
});
答案 1 :(得分:2)
您需要在类型(类)上使用@JsonTypeInfo
注释,其中包含其他类型信息。在您的情况下,它看起来好像您想要将类型ID包含为属性键。
如果是这样,include方法应该是“as wrapper object”,你还需要定义“myobject”绑定的id类型 - 这可以通过为{{1}添加@JsonTypeName("myobject")
来完成} class(它需要包含在具有MyObject
的子类型中,但在这种情况下,两者都将被添加到同一个类中。)
答案 2 :(得分:2)
将List<String>
更改为ArrayList<String>
然后
MyObject myObject = mapper.readValue(json, MyObject.class);
将以下构造函数添加到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;
}
并将getter的返回值更改为ArrayList
答案 3 :(得分:1)
你的json有一个额外的嵌套级别:你有一个字符串映射到MyObjects的列表,而不是MyObjects列表。你需要这样读:
List<Map<String, MyObject>> myObjects = mapper.readValue(json, new TypeReference<List<Map<String, MyObject>>>() {
});
或者改变生成这个json的任何东西来抛弃内部地图(恕我直言,这会更好)。