53

I am having a question with Jackson that I think should be simple to solve, but it is killing me.

Let's say I have a java POJO class that looks like this (assume Getters and Setters for me):

class User { private String name; private Integer age; } 

And I want to deserialize JSON that looks like this into a User object:

{ "user": { "name":"Sam Smith", "age":1 } } 

Jackson is giving me issues because the User is not the first-level object in the JSON. I could obviously make a UserWrapper class that has a single User object and then deserialize using that but I know there must be a more elegant solution.

How should I do this?

2 Answers 2

76

edit: this solution only works for jackson < 2.0

For your case there is a simple solution:

  • You need to annotate your model class with @JsonRootName(value = "user");
  • You need to configure your mapper with om.configure(Feature.UNWRAP_ROOT_VALUE, true); (as for 1.9) and om.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); (for version 2).

That's it!


@JsonRootName(value = "user") public static class User { private String name; private Integer age; public String getName() { return name; } public void setName(final String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(final Integer age) { this.age = age; } @Override public String toString() { return "User [name=" + name + ", age=" + age + "]"; } } ObjectMapper om = new ObjectMapper(); om.configure(Feature.UNWRAP_ROOT_VALUE, true); System.out.println(om.readValue("{ \"user\": { \"name\":\"Sam Smith\", \"age\":1 }}", User.class)); 

this will print:

User [name=Sam Smith, age=1] 
Sign up to request clarification or add additional context in comments.

7 Comments

For anyone who comes to this page in the future, I'd like to note that this only works with Jackson < 2.0 (when it was Codehaus, before it was migrated to FasterXML). I can't find UNWRAP_ROOT_VALUE in the FasterXML Package.
I think it's now DeserializationFeature.UNWRAP_ROOT_VALUE
But what you supposed to do in case API exposes both User and List<User> ?
Also for jackson 2.2 the feature is SerializationFeature.WRAP_ROOT_VALUE
So I know this thread is old, but ist there a solution for when your JSON looks like this? { "user”: [ { "name":"Sam Smith", "age":1 }] } Assuming you can be sure that “user” always is an array with one entry
|
2

This is an old post, and the accepted solution no longer works.

Here is the working code for 2025:

ObjectMapper objectMapper = new ObjectMapper(); objectMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); objectMapper.registerModule(new JavaTimeModule()); User user = aaa.toObject(json, User.class); 

2 Comments

It makes me very happy that my question from 2012 got a new answer in 2025.
Time goes by so quickly and we are getting older day by day, That time we used java 1.7, nowadays java 24 :)

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.