Currently, I have a JSON response of the following type.
{ "user":{ "user":{ "name":"Demo", "age":25, "eail":"demo@abc.com" }, "address":{ "country":"NZ" } } }
I want to map my custom class to nested user attributes.
@Data public class Demo{ @JsonProperty("user") private User user; private Address address; }
But when I am trying to get the attribute, it is always sending null
value. I think it is maping to first occurance of "user"
in line no 2.
How can I map it to correct user
attribute in line no 3.
Advertisement
Answer
Mapping starts from the root of JSON so the correct class definition for this JSON will be this
public class Demo { @JsonProperty("user") private DemoUser user; }
public class DemoUser { @JsonProperty("user") private User user; @JsonProperty("address") private Address address; }
If you want to keep the class as it is and only want to use the inner ‘user’, you can do it using JsonNode like this
ObjectMapper mapper = new ObjectMapper(); JsonNode node = mapper.readValue(jsonString, JsonNode.class); Demo demo = mapper.readValue(node.at("/user").toString(), Demo.class);
The at() method accepts the JSON path expression which is the path to a particular node in the JSON.
Here, "/user"
means it will find the node user
from the root of JSON and will return it.
Similarly,
node.at("/user/user").toString();
will give you
{ "name":"Demo", "age":25, "eail":"demo@abc.com" }