Jackson JSON Deserialization with Root Element
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) andom.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]
Related videos on Youtube
Sam Stern
Developer Programs Engineer at Google, working on Firebase and all things Android. Also occasionally hack on JavaScript, Ruby, Scala, Haskell. (former username hatboysam)
Updated on March 08, 2020Comments
-
Sam Stern about 4 years
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?
-
Sam Stern almost 12 yearsFor 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.
-
jsh almost 12 yearsI think it's now DeserializationFeature.UNWRAP_ROOT_VALUE
-
Mercy Joseph over 10 yearsBut what you supposed to do in case API exposes both User and List<User> ?
-
Koitoer over 10 yearsAlso for jackson 2.2 the feature is SerializationFeature.WRAP_ROOT_VALUE
-
florian over 9 yearsSo 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
-
pedram bashiri about 6 years@FranciscoSpaeth I'm curious about the significance of
@JsonRootName(value = "user");
because even without it, the class name "User" is used as the root element and it works just fine -
Francisco Spaeth about 6 years@pedrambashiri right, from my understanding it will use "user" then and not "User"