如何配置jackson objectmapper以正确反序列化为pojo?

时间:2011-08-31 08:50:50

标签: java deserialization jackson

我在解析反序列化时应该如何配置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);

所以应该以某种方式反过来?

谢谢!

4 个答案:

答案 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的任何东西来抛弃内部地图(恕我直言,这会更好)。