I can’t figure out how to handle nested JSON values in my Java classes. To make it simple as possible, I created four Java classes with every ‘nested level’. However, I’m trying to have all these values in one Java class. How can I do this?
Json:
JavaScript
x
{
"_embedded":{
"events":[
{
"name":"KISS | End Of The Road World Tour",
"dates":{
"start":{
"dateTime":"2021-06-12T19:00:00Z"
},
"classifications":[
{
"name":"Rock"
}
],
"_embedded":{
"venues":[
{
"name":"Atlas Arena"
}
]
}
}
}
]
}
}
Java classes:
JavaScript
@Data
public class EventList {
@JsonProperty("_embedded")
private Events events;
}
@Data
public class Events {
@JsonProperty("events")
public List<EventDetails> eventsList;
}
@Data
public class EventDetails {
private String name;
@JsonProperty("dates.start.dateTime")
private String startDate;
@JsonProperty("classifications.genre.name")
private String musicType;
@JsonProperty("_embedded.venues")
private List<Venues> eventPlaceName;
}
@Data
public class Venues {
private String name;
}
Advertisement
Answer
You can club all the supporting classes in one class like below :
JavaScript
@Data
public class Start {
@JsonProperty("dateTime")
public Date dateTime;
public static class Venue {
@JsonProperty("name")
public String name;
}
@Data
public static class Classification {
@JsonProperty("name")
public String name;
}
@Data
public static class Embedded2 {
@JsonProperty("venues")
public List<Venue> venues;
}
@Data
public static class Dates {
@JsonProperty("start")
public Start start;
@JsonProperty("classifications")
public List<Classification> classifications;
@JsonProperty("_embedded")
public Embedded2 _embedded;
}
@Data
public static class Event {
@JsonProperty("name")
public String name;
@JsonProperty("dates")
public Dates dates;
}
@Data
public static class Embedded {
@JsonProperty("events")
public List<Event> events;
}
@Data
public static class Root {
@JsonProperty("_embedded")
public Embedded _embedded;
}
}
You can test (I am using Jackson for deserialization)
create ObjectMapper class and deserialize into a Root class
JavaScript
public class TestJson {
public static void main(String[] args) {
ObjectMapper objectMapper = new ObjectMapper();
try {
Start.Root root = objectMapper.readValue(new File("C:\Anurag\Development\CodeBase\demo\src\main\java\com\example\demo\domain\testJson\test.json"), Start.Root.class);
System.out.println(root);
} catch (Exception e) {
e.printStackTrace();
}
}
}
-When debugging, you’ll notice that our objects have been filled accordingly:
**Changes done as per your requiement **
JavaScript
@Data
public class EventList {
@Getter
@JsonProperty("_embedded")
private Events events;
@Data
public static class Venue {
@JsonProperty("name")
public String name;
}
@Data
public static class Classification {
@JsonProperty("name")
public String name;
}
@Data
public static class Embedded2 {
@JsonProperty("venues")
public List<Venue> venues;
}
@Data
public static class Dates {
@JsonProperty("start")
public Start start;
@JsonProperty("classifications")
public List<Classification> classifications;
@JsonProperty("_embedded")
public Embedded2 _embedded;
}
@Data
public static class EventDetails {
@JsonProperty("name")
public String name;
@JsonProperty("dates")
public Dates dates;
}
@Data
public static class Events {
@JsonProperty("events")
public List<EventDetails> eventsList;
}
@Data
public static class Start {
@JsonProperty("dateTime")
public Date dateTime;
}
}
JavaScript
public class TestJson {
public static void main(String[] args) {
List<EventList.EventDetails> anyCity = findEventByCity("any city");
anyCity.stream().forEach(p-> {
System.out.println(p);
});
}
@SneakyThrows
static List<EventList.EventDetails> findEventByCity(String city) {
ObjectMapper objectMapper = new ObjectMapper();
EventList eventList = objectMapper.readValue(new File("C:\Anurag\Development\CodeBase\demo\src\main\java\com\example\demo\domain\testJson\test.json"), EventList.class);
List<EventList.EventDetails> eventsList = eventList.getEvents().getEventsList();
return eventsList;
}
}