常见的用Java来解析复杂Json的例子

解析复杂的JSON字符串在Java中可以通过多种工具和库来实现。常用的库包括Jackson、Gson和org.json等。以下是使用各种库的示例来解析复杂的JSON字符串。

使用Jackson

Jackson是一个非常流行的JSON处理库,非常适合解析复杂的JSON结构。

依赖

首先,确保在你的项目中包含Jackson的依赖。例如,在Maven项目中,你可以在pom.xml添加以下依赖:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.1</version>
</dependency>
示例JSON

假设有以下复杂的JSON字符串:

{
  "id": 1,
  "projectName": "Example Project",
  "details": {
    "description": "This is a sample project",
    "fileDetails": [
      {
        "fileUrl": "https://example.com/files/document1.pdf",
        "fileName": "document1.pdf",
        "fileSize": "2048KB"
      },
      {
        "fileUrl": "https://example.com/files/document2.pdf",
        "fileName": "document2.pdf",
        "fileSize": "1024KB"
      }
    ]
  },
  "metaData": {
    "createdAt": "2021-10-24T14:48:00.000Z",
    "updatedAt": "2021-11-24T14:48:00.000Z"
  }
}
Java对象

根据JSON结构,定义相应的Java类来映射这些数据:

import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;

public class ImportFileDetailRequest {
    @JsonProperty("fileUrl")
    private String fileUrl;

    @JsonProperty("fileName")
    private String fileName;

    @JsonProperty("fileSize")
    private String fileSize;

    // Getters and Setters
}

public class Details {
    @JsonProperty("description")
    private String description;

    @JsonProperty("fileDetails")
    private List<ImportFileDetailRequest> fileDetails;

    // Getters and Setters
}

public class MetaData {
    @JsonProperty("createdAt")
    private String createdAt;
    
    @JsonProperty("updatedAt")
    private String updatedAt;
    
    // Getters and Setters
}

public class Project {
    @JsonProperty("id")
    private int id;

    @JsonProperty("projectName")
    private String projectName;

    @JsonProperty("details")
    private Details details;

    @JsonProperty("metaData")
    private MetaData metaData;

    // Getters and Setters
}
解析JSON

使用Jackson的ObjectMapper类来解析JSON字符串:

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonParserExample {
    public static void main(String[] args) {
        String jsonString = "{ \"id\": 1, \"projectName\": \"Example Project\", \"details\": { \"description\": \"This is a sample project\", \"fileDetails\": [ { \"fileUrl\": \"https://example.com/files/document1.pdf\", \"fileName\": \"document1.pdf\", \"fileSize\": \"2048KB\" }, { \"fileUrl\": \"https://example.com/files/document2.pdf\", \"fileName\": \"document2.pdf\", \"fileSize\": \"1024KB\" } ] }, \"metaData\": { \"createdAt\": \"2021-10-24T14:48:00.000Z\", \"updatedAt\": \"2021-11-24T14:48:00.000Z\" }}";

        ObjectMapper objectMapper = new ObjectMapper();

        try {
            Project project = objectMapper.readValue(jsonString, Project.class);
            System.out.println("Project Name: " + project.getProjectName());
            System.out.println("File Details: " + project.getDetails().getFileDetails());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

使用Gson

Gson是另一个流行的JSON解析库。

依赖

确保在你的项目中包含Gson的依赖。例如,在Maven项目中:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.8</version>
</dependency>
解析JSON

使用Gson来解析相同的JSON字符串:

import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        String jsonString = "{ \"id\": 1, \"projectName\": \"Example Project\", \"details\": { \"description\": \"This is a sample project\", \"fileDetails\": [ { \"fileUrl\": \"https://example.com/files/document1.pdf\", \"fileName\": \"document1.pdf\", \"fileSize\": \"2048KB\" }, { \"fileUrl\": \"https://example.com/files/document2.pdf\", \"fileName\": \"document2.pdf\", \"fileSize\": \"1024KB\" } ] }, \"metaData\": { \"createdAt\": \"2021-10-24T14:48:00.000Z\", \"updatedAt\": \"2021-11-24T14:48:00.000Z\" }}";

        Gson gson = new Gson();
        Project project = gson.fromJson(jsonString, Project.class);
        
        System.out.println("Project Name: " + project.getProjectName());
        System.out.println("File Details: " + project.getDetails().getFileDetails());
    }
}

class ImportFileDetailRequest {
    @SerializedName("fileUrl")
    private String fileUrl;

    @SerializedName("fileName")
    private String fileName;

    @SerializedName("fileSize")
    private String fileSize;

    // Getters and Setters
}

class Details {
    @SerializedName("description")
    private String description;

    @SerializedName("fileDetails")
    private List<ImportFileDetailRequest> fileDetails;

    // Getters and Setters
}

class MetaData {
    @SerializedName("createdAt")
    private String createdAt;
    
    @SerializedName("updatedAt")
    private String updatedAt;
    
    // Getters and Setters
}

class Project {
    @SerializedName("id")
    private int id;

    @SerializedName("projectName")
    private String projectName;

    @SerializedName("details")
    private Details details;

    @SerializedName("metaData")
    private MetaData metaData;

    // Getters and Setters
}

使用org.json

org.json库提供了较为直接的方式来操作JSON对象。

依赖

确保在你的项目中包含org.json依赖。例如,在Maven项目中:

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20210307</version>
</dependency>
解析JSON

使用JSONObjectJSONArray来解析JSON字符串:

import org.json.JSONArray;
import org.json.JSONObject;

public class JsonParserUsingOrgJson {
    public static void main(String[] args) {
        String jsonString = "{ \"id\": 1, \"projectName\": \"Example Project\", \"details\": { \"description\": \"This is a sample project\", \"fileDetails\": [ { \"fileUrl\": \"https://example.com/files/document1.pdf\", \"fileName\": \"document1.pdf\", \"fileSize\": \"2048KB\" }, { \"fileUrl\": \"https://example.com/files/document2.pdf\", \"fileName\": \"document2.pdf\", \"fileSize\": \"1024KB\" } ] }, \"metaData\": { \"createdAt\": \"2021-10-24T14:48:00.000Z\", \"updatedAt\": \"2021-11-24T14:48:00.000Z\" }}";

        JSONObject jsonObject = new JSONObject(jsonString);

        int id = jsonObject.getInt("id");
        String projectName = jsonObject.getString("projectName");
        JSONObject details = jsonObject.getJSONObject("details");
        String description = details.getString("description");
        JSONArray fileDetails = details.getJSONArray("fileDetails");

        System.out.println("Project ID: " + id);
        System.out.println("Project Name: " + projectName);
        System.out.println("Description: " + description);
        for (int i = 0; i < fileDetails.length(); i++) {
            JSONObject fileDetail = fileDetails.getJSONObject(i);
            System.out.println("File URL: " + fileDetail.getString("fileUrl"));
            System.out.println("File Name: " + fileDetail.getString("fileName"));
            System.out.println("File Size: " + fileDetail.getString("fileSize"));
        }

        JSONObject metaData = jsonObject.getJSONObject("metaData");
        String createdAt = metaData.getString("createdAt");
        String updatedAt = metaData.getString("updatedAt");

        System.out.println("Created At: " + createdAt);
        System.out.println("Updated At: " + updatedAt);
    }
}

使用Hutool.JSONUtil

Hutool 是一个功能强大且轻量级的 Java 工具库,提供了丰富的工具类,其中 JSONUtil 类可以方便地解析和操作 JSON 数据。下面是使用 Hutool 解析复杂 JSON 字符串的完整示例。

示例 JSON 字符串

假设有以下复杂的 JSON 字符串:

{
  "id": 1,
  "projectName": "Example Project",
  "details": {
    "description": "This is a sample project",
    "fileDetails": [
      {
        "fileUrl": "https://example.com/files/document1.pdf",
        "fileName": "document1.pdf",
        "fileSize": "2048KB"
      },
      {
        "fileUrl": "https://example.com/files/document2.pdf",
        "fileName": "document2.pdf",
        "fileSize": "1024KB"
      }
    ]
  },
  "metaData": {
    "createdAt": "2021-10-24T14:48:00.000Z",
    "updatedAt": "2021-11-24T14:48:00.000Z"
  }
}

添加 Hutool 依赖

确保在你的项目中包含 Hutool 的依赖。例如,在 Maven 项目中,你可以在 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.17</version>
</dependency>

定义 Java 类

定义与 JSON 结构对应的 Java 类:

import cn.hutool.core.annotation.Alias;
import java.util.List;

public class ImportFileDetailRequest {
    @Alias("fileUrl")
    private String fileUrl;

    @Alias("fileName")
    private String fileName;

    @Alias("fileSize")
    private String fileSize;

    // Getters and Setters
}

public class Details {
    @Alias("description")
    private String description;

    @Alias("fileDetails")
    private List<ImportFileDetailRequest> fileDetails;

    // Getters and Setters
}

public class MetaData {
    @Alias("createdAt")
    private String createdAt;
    
    @Alias("updatedAt")
    private String updatedAt;
    
    // Getters and Setters
}

public class Project {
    @Alias("id")
    private int id;

    @Alias("projectName")
    private String projectName;

    @Alias("details")
    private Details details;

    @Alias("metaData")
    private MetaData metaData;

    // Getters and Setters
}

解析 JSON

使用 Hutool 的 JSONUtil 类来解析 JSON 字符串:

import cn.hutool.json.JSONUtil;

public class JsonParserExample {
    public static void main(String[] args) {
        String jsonString = "{ \"id\": 1, \"projectName\": \"Example Project\", \"details\": { \"description\": \"This is a sample project\", \"fileDetails\": [ { \"fileUrl\": \"https://example.com/files/document1.pdf\", \"fileName\": \"document1.pdf\", \"fileSize\": \"2048KB\" }, { \"fileUrl\": \"https://example.com/files/document2.pdf\", \"fileName\": \"document2.pdf\", \"fileSize\": \"1024KB\" } ] }, \"metaData\": { \"createdAt\": \"2021-10-24T14:48:00.000Z\", \"updatedAt\": \"2021-11-24T14:48:00.000Z\" }}";

        // 解析 JSON 字符串
        Project project = JSONUtil.toBean(jsonString, Project.class);

        // 输出解析结果
        System.out.println("Project Name: " + project.getProjectName());
        System.out.println("Description: " + project.getDetails().getDescription());
        for (ImportFileDetailRequest fileDetail : project.getDetails().getFileDetails()) {
            System.out.println("File URL: " + fileDetail.getFileUrl());
            System.out.println("File Name: " + fileDetail.getFileName());
            System.out.println("File Size: " + fileDetail.getFileSize());
        }
        System.out.println("Created at: " + project.getMetaData().getCreatedAt());
        System.out.println("Updated at: " + project.getMetaData().getUpdatedAt());
    }
}

逐步解析JSON

如果不想映射成Java对象,可以使用JSONObjectJSONArray逐步解析:

import cn.hutool.json.JSONUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONArray;
import java.util.List;

public class JsonParserStepByStep {
    public static void main(String[] args) {
        String jsonString = "{ \"id\": 1, \"projectName\": \"Example Project\", \"details\": { \"description\": \"This is a sample project\", \"fileDetails\": [ { \"fileUrl\": \"https://example.com/files/document1.pdf\", \"fileName\": \"document1.pdf\", \"fileSize\": \"2048KB\" }, { \"fileUrl\": \"https://example.com/files/document2.pdf\", \"fileName\": \"document2.pdf\", \"fileSize\": \"1024KB\" } ] }, \"metaData\": { \"createdAt\": \"2021-10-24T14:48:00.000Z\", \"updatedAt\": \"2021-11-24T14:48:00.000Z\" }}";

        // 将字符串转成JSONObject对象
        JSONObject jsonObject = JSONUtil.parseObj(jsonString);

        // 逐步解析数据
        int id = jsonObject.getInt("id");
        String projectName = jsonObject.getStr("projectName");

        JSONObject details = jsonObject.getJSONObject("details");
        String description = details.getStr("description");
        JSONArray fileDetails = details.getJSONArray("fileDetails");

        System.out.println("Project ID: " + id);
        System.out.println("Project Name: " + projectName);
        System.out.println("Description: " + description);
        for (int i = 0; i < fileDetails.size(); i++) {
            JSONObject fileDetail = fileDetails.getJSONObject(i);
            String fileUrl = fileDetail.getStr("fileUrl");
            String fileName = fileDetail.getStr("fileName");
            String fileSize = fileDetail.getStr("fileSize");
            System.out.println("File URL: " + fileUrl);
            System.out.println("File Name: " + fileName);
            System.out.println("File Size: " + fileSize);
        }

        JSONObject metaData = jsonObject.getJSONObject("metaData");
        String createdAt = metaData.getStr("createdAt");
        String updatedAt = metaData.getStr("updatedAt");

        System.out.println("Created At: " + createdAt);
        System.out.println("Updated At: " + updatedAt);
    }
}

总结

上述示例分别展示了如何使用Jackson、Gson和org.json库以及Hutool的JSONUtil类来解析复杂的JSON字符串。根据你的需求和喜好选择合适的库,合理定义Java对象,并结合库的特点来进行JSON解析。Jackson和Gson更适合映射复杂对象,org.json则适合直接操作。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,首先需要导入相关的包,比如: ```java import org.json.JSONObject; import org.json.JSONArray; import org.json.JSONException; ``` 然后可以使用 JSONObject 类和 JSONArray 类来解析 JSON 数据。比如,我们有以下 JSON 字符串: ```json { "name": "John", "age": 30, "city": "New York" } ``` 我们可以使用以下代码将其解析JSONObject 对象: ```java String jsonString = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}"; try { JSONObject jsonObj = new JSONObject(jsonString); String name = jsonObj.getString("name"); int age = jsonObj.getInt("age"); String city = jsonObj.getString("city"); System.out.println(name + " " + age + " " + city); } catch (JSONException e) { e.printStackTrace(); } ``` 输出结果:John 30 New York。 如果我们有以下 JSON 数组字符串: ```json [{ "name": "John", "age": 30, "city": "New York" }, { "name": "Jane", "age": 25, "city": "Los Angeles" }] ``` 我们可以使用以下代码将其解析JSONArray 对象,并遍历其中的每个元素: ```java String jsonArrayString = "[{\"name\":\"John\",\"age\":30,\"city\":\"New York\"},{\"name\":\"Jane\",\"age\":25,\"city\":\"Los Angeles\"}]"; try { JSONArray jsonArray = new JSONArray(jsonArrayString); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObj = jsonArray.getJSONObject(i); String name = jsonObj.getString("name"); int age = jsonObj.getInt("age"); String city = jsonObj.getString("city"); System.out.println(name + " " + age + " " + city); } } catch (JSONException e) { e.printStackTrace(); } ``` 输出结果: John 30 New York Jane 25 Los Angeles 希望这个例子可以帮助你理解如何使用 Java 解析 JSON 数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值