Java 复杂 JSON 报文处理

在 Java 开发中,处理复杂的 JSON 报文是一项常见的任务。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于前后端数据传输和存储。本文将介绍如何使用 Java 处理复杂的 JSON 报文,并提供一些代码示例。

什么是复杂的 JSON 报文

复杂的 JSON 报文通常包含多层嵌套的对象和数组。例如,以下是一个复杂的 JSON 报文示例:

{
  "name": "John",
  "age": 30,
  "address": {
    "street": "123 Main St",
    "city": "New York",
    "state": "NY"
  },
  "friends": [
    {
      "name": "Alice",
      "age": 28
    },
    {
      "name": "Bob",
      "age": 32
    }
  ]
}

该报文包含了一个顶层对象,其中包含了姓名、年龄、地址和朋友列表。地址又包含了街道、城市和州信息。朋友列表是一个包含多个对象的数组。

使用第三方库处理复杂 JSON 报文

为了方便地处理复杂的 JSON 报文,我们可以使用一些流行的第三方库,如 Jackson、Gson 或 JSON.simple。这些库提供了丰富的工具和方法来解析和构建 JSON 对象。

使用 Jackson 处理 JSON

Jackson 是一个功能强大的 JSON 处理库,提供了灵活的 API 来处理复杂的 JSON 报文。以下是使用 Jackson 解析上述 JSON 报文的示例代码:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonParsingExample {
  public static void main(String[] args) {
    // 定义 JSON 报文
    String json = "{\"name\":\"John\",\"age\":30,\"address\":{\"street\":\"123 Main St\",\"city\":\"New York\",\"state\":\"NY\"},\"friends\":[{\"name\":\"Alice\",\"age\":28},{\"name\":\"Bob\",\"age\":32}]}";

    try {
      // 创建 ObjectMapper 对象
      ObjectMapper objectMapper = new ObjectMapper();

      // 解析 JSON 报文
      JsonNode rootNode = objectMapper.readTree(json);

      // 获取顶层属性值
      String name = rootNode.get("name").asText();
      int age = rootNode.get("age").asInt();

      // 获取嵌套对象的属性值
      String street = rootNode.get("address").get("street").asText();
      String city = rootNode.get("address").get("city").asText();
      String state = rootNode.get("address").get("state").asText();

      // 遍历数组
      JsonNode friendsNode = rootNode.get("friends");
      for (JsonNode friendNode : friendsNode) {
        String friendName = friendNode.get("name").asText();
        int friendAge = friendNode.get("age").asInt();
        System.out.println("Friend: " + friendName + ", Age: " + friendAge);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

上述代码使用 Jackson 的 ObjectMapper 类来解析 JSON 报文。使用该类的 readTree 方法可以将 JSON 字符串转换为一个树形结构的 JsonNode 对象,从而方便我们获取和操作其中的属性。

使用 Gson 处理 JSON

Gson 是另一个常用的 JSON 处理库,具有简单易用的 API。以下是使用 Gson 解析上述 JSON 报文的示例代码:

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

public class JsonParsingExample {
  public static void main(String[] args) {
    // 定义 JSON 报文
    String json = "{\"name\":\"John\",\"age\":30,\"address\":{\"street\":\"123 Main St\",\"city\":\"New York\",\"state\":\"NY\"},\"friends\":[{\"name\":\"Alice\",\"age\":28},{\"name\":\"Bob\",\"age\":32}]}";

    // 创建 Gson 对象
    Gson gson = new Gson();

    // 解析 JSON 报文
    JsonObject jsonObject = gson.fromJson(json, JsonObject.class);
    String name = jsonObject.get("name").getAsString();
    int age = jsonObject.get("age").getAsInt();

    JsonObject addressObject = jsonObject.get("address").getAsJsonObject();
    String street = addressObject.get("street").getAsString();
    String city = addressObject.get("city").getAsString();
    String state =