diff --git a/json-modules/json-operations/README.md b/json-modules/json-operations/README.md new file mode 100644 index 000000000000..512b64d9b27e --- /dev/null +++ b/json-modules/json-operations/README.md @@ -0,0 +1,2 @@ +## Relevant Articles + diff --git a/json-modules/json-operations/pom.xml b/json-modules/json-operations/pom.xml new file mode 100644 index 000000000000..fc9f01e4347d --- /dev/null +++ b/json-modules/json-operations/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + org.baeldung + json-operations + json-operations + + + com.baeldung + json-modules + 1.0.0-SNAPSHOT + + + + + com.google.code.gson + gson + ${gson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + + 2.11.0 + + + diff --git a/json-modules/json-operations/src/main/java/com/baeldung/sorting/SolarEvent.java b/json-modules/json-operations/src/main/java/com/baeldung/sorting/SolarEvent.java new file mode 100644 index 000000000000..457fde006388 --- /dev/null +++ b/json-modules/json-operations/src/main/java/com/baeldung/sorting/SolarEvent.java @@ -0,0 +1,103 @@ +package com.baeldung.sorting; + +import com.fasterxml.jackson.annotation.JsonProperty; + +class SolarEvent { + + @JsonProperty("event_name") + private String eventName; + @JsonProperty("date") + private String date; + @JsonProperty("coordinates") + private Coordinates coordinates; + @JsonProperty("type") + private String type; + @JsonProperty("class") + private String eventClass; + @JsonProperty("size") + private String size; + @JsonProperty("speed_km_per_s") + private int speedKmPerS; + + public String getEventName() { + return eventName; + } + + public void setEventName(String eventName) { + this.eventName = eventName; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public Coordinates getCoordinates() { + return coordinates; + } + + public void setCoordinates(Coordinates coordinates) { + this.coordinates = coordinates; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getEventClass() { + return eventClass; + } + + public void setEventClass(String eventClass) { + this.eventClass = eventClass; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public int getSpeedKmPerS() { + return speedKmPerS; + } + + public void setSpeedKmPerS(int speedKmPerS) { + this.speedKmPerS = speedKmPerS; + } +} + +class Coordinates { + + @JsonProperty("latitude") + private double latitude; + + @JsonProperty("longitude") + private double longitude; + + public double getLatitude() { + return latitude; + } + + public void setLatitude(double latitude) { + this.latitude = latitude; + } + + public double getLongitude() { + return longitude; + } + + public void setLongitude(double longitude) { + this.longitude = longitude; + } + +} diff --git a/json-modules/json-operations/src/main/java/com/baeldung/sorting/SolarEventContainer.java b/json-modules/json-operations/src/main/java/com/baeldung/sorting/SolarEventContainer.java new file mode 100644 index 000000000000..b347ac777af3 --- /dev/null +++ b/json-modules/json-operations/src/main/java/com/baeldung/sorting/SolarEventContainer.java @@ -0,0 +1,20 @@ +package com.baeldung.sorting; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class SolarEventContainer { + + @JsonProperty("solar_events") + private List solarEvents; + + // Getters and setters + public List getSolarEvents() { + return solarEvents; + } + + public void setSolarEvents(List solarEvents) { + this.solarEvents = solarEvents; + } +} diff --git a/json-modules/json-operations/src/test/java/com/baeldung/sorting/JsonObjectSortingUnitTest.java b/json-modules/json-operations/src/test/java/com/baeldung/sorting/JsonObjectSortingUnitTest.java new file mode 100644 index 000000000000..e61ef7d1f86e --- /dev/null +++ b/json-modules/json-operations/src/test/java/com/baeldung/sorting/JsonObjectSortingUnitTest.java @@ -0,0 +1,75 @@ +package com.baeldung.sorting; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import com.google.gson.stream.JsonReader; + +class JsonObjectSortingUnitTest { + + @Test + void givenJsonObject_whenUsingJackson_thenSortedBySpeedCorrectly() throws IOException { + ObjectMapper objectMapper = new ObjectMapper(); + SolarEventContainer container = objectMapper.readValue( + new File("src/test/resources/solar_events.json"), SolarEventContainer.class); + + List events = container.getSolarEvents(); + Collections.sort(events, Comparator.comparingInt(event -> event.getSpeedKmPerS())); + + assertEquals(100, events.get(0) + .getSpeedKmPerS()); + assertEquals(500, events.get(1) + .getSpeedKmPerS()); + assertEquals(1000, events.get(2) + .getSpeedKmPerS()); + assertEquals(1500, events.get(3) + .getSpeedKmPerS()); + } + + @Test + public void givenJsonObject_whenUsingGson_thenSortedBySizeCorrectly() throws FileNotFoundException { + JsonReader reader = new JsonReader(new FileReader("src/test/resources/solar_events.json")); + JsonElement element = JsonParser.parseReader(reader); + JsonArray events = element.getAsJsonObject().getAsJsonArray("solar_events"); + List list = events.asList(); + + Collections.sort(list, (a, b) -> { + double latA = a.getAsJsonObject() + .getAsJsonObject("coordinates") + .get("latitude") + .getAsDouble(); + double latB = b.getAsJsonObject() + .getAsJsonObject("coordinates") + .get("latitude") + .getAsDouble(); + return Double.compare(latA, latB); + }); + + assertEquals(-5, getJsonAttributeAsInt(list.get(0))); + assertEquals(0, getJsonAttributeAsInt(list.get(1))); + assertEquals(15, getJsonAttributeAsInt(list.get(2))); + assertEquals(37, getJsonAttributeAsInt(list.get(3))); + } + + private int getJsonAttributeAsInt(JsonElement element) { + return element.getAsJsonObject() + .getAsJsonObject("coordinates") + .get("latitude") + .getAsInt(); + } + +} diff --git a/json-modules/json-operations/src/test/resources/solar_events.json b/json-modules/json-operations/src/test/resources/solar_events.json new file mode 100644 index 000000000000..d1388628e17d --- /dev/null +++ b/json-modules/json-operations/src/test/resources/solar_events.json @@ -0,0 +1,44 @@ +{ + "solar_events": [ + { + "event_name": "Solar Eclipse", + "date": "2024-04-08", + "coordinates": { + "latitude": 37.7749, + "longitude": -122.4194 + }, + "size": "Large", + "speed_km_per_s": 1000 + }, + { + "event_name": "Solar Flare", + "date": "2023-10-28", + "coordinates": { + "latitude": 0, + "longitude": 0 + }, + "size": "Small", + "speed_km_per_s": 100 + }, + { + "event_name": "Sunspot", + "date": "2023-11-15", + "coordinates": { + "latitude": 15, + "longitude": -75 + }, + "size": "Large", + "speed_km_per_s": 1500 + }, + { + "event_name": "Coronal Mass Ejection", + "date": "2024-01-10", + "coordinates": { + "latitude": -5, + "longitude": 80 + }, + "size": "Medium", + "speed_km_per_s": 500 + } + ] +} \ No newline at end of file diff --git a/json-modules/pom.xml b/json-modules/pom.xml index 70b64624d485..36f9a0fb2945 100644 --- a/json-modules/pom.xml +++ b/json-modules/pom.xml @@ -18,6 +18,7 @@ json-2 json-arrays json-conversion + json-operations json-path gson gson-2 @@ -38,4 +39,4 @@ 20240303 - \ No newline at end of file +