知識庫 / JSON RSS 訂閱

在Java中排序JSON對象

JSON
HongKong
5
09:43 PM · Dec 05 ,2025

1. 概述

JSON 是一種廣泛使用的結構化數據格式,通常用於大多數現代 API 和數據服務。它特別受 Web 應用程序的歡迎,因為其輕量級特性和與 JavaScript 的兼容性。

有時,在應用程序中顯示數據之前,對數據進行排序可能很有用。

在本快速教程中,我們將探討幾種在 Java 中對 JSON 對象進行排序的方法。

2. 開始使用

讓我們從定義一個相對簡單的 JSON 結構開始,該結構模擬了一些虛構的太陽事件:

{
    "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
        }
    ]
}

在本文教程中,此JSON文檔將是示例的重點。

3. 使用 Jackson

在第一個示例中,我們將深入瞭解 Jackson,這是一個多用途的 Java 庫,用於處理 JSON 數據。

首先,我們需要將 jackson-databind 依賴添加到我們的 pom.xml 中:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.17.2</version>
</dependency>

我們還需要定義幾個簡單的POJO對象,以便將我們的JSON字符串反序列化為Java對象:

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;

    // Getters and Setters
}

class Coordinates {
    @JsonProperty("latitude")
    private double latitude;

    @JsonProperty("longitude")
    private double longitude;

    // Getters and setters
}

我們還將定義一個容器對象來存儲我們的事件列表:

class SolarEventContainer {
    @JsonProperty("solar_events")
    private List<SolarEvent> solarEvents;

    //Getters and setters
}

現在,我們可以編寫一個簡單的單元測試來驗證我們是否可以使用給定的屬性對太陽事件列表進行排序:

@Test
void givenJsonObjects_whenUsingJackson_thenSortedBySpeedCorrectly() throws IOException {
    ObjectMapper objectMapper = new ObjectMapper();
    SolarEventContainer container =
      objectMapper.readValue(new File("src/test/resources/solar_events.json"),
      SolarEventContainer.class);

    List<SolarEvent> 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());
}

我們的首要目標是解析 JSON 並將其反序列化為我們的對象模型。為此,我們使用了 Jackson 的標準 ObjectMapper。我們使用 readValue() 方法從文件中讀取 JSON 並將 JSON 轉換為 SolarEventContainer 對象。

現在我們已經擁有一個 Java 對象模型,我們可以根據類中的任何屬性對對象進行排序。對於排序,我們使用 lambda 表達式定義一個 Comparator,並使用靜態工廠方法 comparingInt() 對事件進行排序,利用 getSpeedKmPerS() 方法。

最後,我們的測試確認速度屬性正確地對事件進行了排序。

4. 使用 Gson

現在,讓我們來研究一種類似的方法,使用另一個流行的 JSON 處理庫 Gson。 就像之前一樣,首先我們需要將此依賴項添加到我們的 <em >pom.xml</em >> 中:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.11.0</version>
</dependency>

如往常一樣,最新版本可從 Maven 倉庫 下載。

有時,我們可能無法使用我們自己的內部 Java 對象模型進行工作,因此在本例中,我們將看到如何使用來自該庫的 JSON Java 對象:

@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<JsonElement> 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();
}

如我們所見,我們採用與讀取樣本 JSON 文件相似的方法,但這次我們檢索的是一個 JsonElement 對象的列表,它代表了 solar_events.json文件中每個條目。

同樣,我們現在可以使用 Collections.sort方法通過提供自定義比較器來對列表中的元素進行排序,從而從 JSON 對象中解析並選擇所需的屬性值。 這比之前的示例更冗長,並且如果我們的 JSON 結構發生變化或我們拼錯了 JSON 對象或屬性名稱,則容易出錯

最後,這次我們使用緯度值來檢查元素是否已正確排序。我們還提供了一個小型實用方法,以幫助我們從 JSON 元素中提取值。

5. 結論

在本文中,我們學習瞭如何使用兩個流行的 JSON 處理 Java 庫對 JSON 對象進行排序。

在第一個示例中,我們看到了如何使用我們自己的 Java 對象模型與流行的 Jackson 庫一起使用。隨後,我們學習瞭如何直接與 Gson 庫提供的對象模型一起工作。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.