开发者

How do I configure the the jackson objectmapper to correctly deserialize to pojo?

I'm having a bit of a problem understanding how i should configure the objectMapper and pojo when deserializing. My Json is created by another application that supports both xml and json. It returns a list with myobject, but the Json contains the type, like this:

[
    {
        "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"
        }
    }
]

My class:

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;
    }
}

But when doing:

List<MyObject> myObjects = mapper.convertValue(rootNode, new TypeReference<List<MyObject>>() {});

I'm getting a exception stating:

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"])

It's like the开发者_运维问答 mapper do not understand the extra "layer". When serializing to get this structure it is possible to configure the mapper like this: mapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);

So there should be somehow to do the reverse?

Thank you!


You need to give it concrete classes and not interfaces. So

List<Map<String, MyObject>> myObjects = mapper.readValue(json, new TypeReference<ArrayList<HashMap<String, MyObject>>>() {
        });


What you need is to use @JsonTypeInfo annotation on type (class), which will include additional type information. In your case it looks as if you wanted to include a type id as property key.

If so, inclusion method should be "as wrapper object", and you will also need to define what type id of "myobject" binds to -- this can be done by adding @JsonTypeName("myobject") for MyObject class (it needs to be included in subtype of whatever has @JsonTypeInfo, but in this case both would be added for the same class).


Your json has an extra level of nesting: you have a list of Maps of Strings to MyObjects, not a List of MyObjects. You'd need to read it like this:

List<Map<String, MyObject>> myObjects = mapper.readValue(json, new TypeReference<List<Map<String, MyObject>>>() {
        });

Or else change whatever is generating this json to ditch the inner Map (IMHO that'd be better).


Change List<String> to ArrayList<String> and then

MyObject myObject = mapper.readValue(json, MyObject.class);

Add the following constructor to MyObject class

@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;    
}

and change the return value for the getter to ArrayList

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜