杰瑞科技汇

Java JSON字符串如何转对象?

我将为你详细介绍几种主流的方法,从最简单到最灵活,并提供完整的代码示例。

Java JSON字符串如何转对象?-图1
(图片来源网络,侵删)

核心步骤

无论使用哪种库,基本步骤都是相似的:

  1. 添加依赖:在你的项目中引入处理 JSON 的库。
  2. 创建 Java 类(POJO/DTO):创建一个与 JSON 结构相匹配的 Java 类。
  3. 调用库的解析方法:使用库的 API 将 JSON 字符串解析为你创建的 Java 对象。

使用 Jackson (最流行、最强大)

Jackson 是目前 Java 生态中最流行、功能最全面的 JSON 处理库,Spring Boot 等主流框架都默认使用它。

添加依赖 (Maven)

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version> <!-- 使用最新的稳定版本 -->
</dependency>

创建 Java 类 (POJO)

假设我们有如下的 JSON 字符串:

{
  "name": "张三",
  "age": 30,
  "isStudent": false,
  "courses": [
    "Java",
    "Spring Boot"
  ],
  "address": {
    "city": "北京",
    "street": "中关村大街1号"
  }
}

我们需要创建对应的 Java 类来映射这个结构。

Java JSON字符串如何转对象?-图2
(图片来源网络,侵删)
// Address.java
public class Address {
    private String city;
    private String street;
    // 必须有无参构造器
    public Address() {}
    // Getters and Setters (Lombok 可以简化这个过程)
    public String getCity() { return city; }
    public void setCity(String city) { this.city = city; }
    public String getStreet() { return street; }
    public void setStreet(String street) { this.street = street; }
    @Override
    public String toString() {
        return "Address{" + "city='" + city + '\'' + ", street='" + street + '\'' + '}';
    }
}
// User.java
import java.util.List;
public class User {
    private String name;
    private int age;
    private boolean isStudent;
    private List<String> courses;
    private Address address;
    // 必须有无参构造器
    public User() {}
    // Getters and Setters
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
    public boolean isStudent() { return isStudent; }
    public void setStudent(boolean student) { isStudent = student; }
    public List<String> getCourses() { return courses; }
    public void setCourses(List<String> courses) { this.courses = courses; }
    public Address getAddress() { return address; }
    public void setAddress(Address address) { this.address = address; }
    @Override
    public String toString() {
        return "User{" + "name='" + name + '\'' + ", age=" + age + ", isStudent=" + isStudent + 
               ", courses=" + courses + ", address=" + address + '}';
    }
}

注意

  • 类的属性名需要与 JSON 的 key 对应,如果不同,可以使用 @JsonProperty 注解,@JsonProperty("user_name") private String name;
  • JSON 中的 true/false 会自动映射到 boolean 类型。
  • JSON 数组 [...] 会映射到 List 或数组。
  • JSON 对象 会映射到另一个自定义的 Java 对象。

进行转换

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonExample {
    public static void main(String[] args) {
        String jsonString = """
            {
              "name": "张三",
              "age": 30,
              "isStudent": false,
              "courses": [
                "Java",
                "Spring Boot"
              ],
              "address": {
                "city": "北京",
                "street": "中关村大街1号"
              }
            }
            """;
        // 创建 ObjectMapper 实例
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            // 将 JSON 字符串转换为 User 对象
            User user = objectMapper.readValue(jsonString, User.class);
            // 打印结果
            System.out.println("转换成功!");
            System.out.println(user);
            System.out.println("用户姓名: " + user.getName());
            System.out.println("所在城市: " + user.getAddress().getCity());
        } catch (JsonProcessingException e) {
            System.err.println("JSON 解析失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

使用 Gson (Google 出品,简单易用)

Gson 是 Google 开发的另一个非常流行的 JSON 库,以其简洁的 API 而闻名。

添加依赖 (Maven)

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version> <!-- 使用最新的稳定版本 -->
</dependency>

创建 Java 类

完全相同,你需要创建与 JSON 结构匹配的 UserAddress 类(包含无参构造器和 Getter/Setter)。

进行转换

import com.google.gson.Gson;
public class GsonExample {
    public static void main(String[] args) {
        String jsonString = """
            {
              "name": "李四",
              "age": 25,
              "isStudent": true,
              "courses": [
                "Python",
                "Machine Learning"
              ],
              "address": {
                "city": "上海",
                "street": "浦东新区张江路"
              }
            }
            """;
        // 创建 Gson 实例
        Gson gson = new Gson();
        try {
            // 将 JSON 字符串转换为 User 对象
            User user = gson.fromJson(jsonString, User.class);
            // 打印结果
            System.out.println("转换成功!");
            System.out.println(user);
            System.out.println("用户姓名: " + user.getName());
            System.out.println("所在城市: " + user.getAddress().getCity());
        } catch (Exception e) {
            System.err.println("JSON 解析失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

可以看到,Gson 的 API 非常简洁,new Gson() 即可完成初始化。


使用 org.json (轻量级)

这是一个非常轻量级的库,不需要定义完整的 Java 类,可以直接操作 JSON 数据,适合处理结构简单或动态的 JSON。

添加依赖 (Maven)

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20251013</version> <!-- 使用最新的稳定版本 -->
</dependency>

进行转换

这种方法不需要预先创建 UserAddress 类。

import org.json.JSONObject;
import org.json.JSONArray;
public class OrgJsonExample {
    public static void main(String[] args) {
        String jsonString = """
            {
              "name": "王五",
              "age": 28,
              "isStudent": false,
              "courses": [
                "C++",
                "Data Structure"
              ],
              "address": {
                "city": "深圳",
                "street": "南山区科技园"
              }
            }
            """;
        try {
            // 将整个 JSON 字符串解析为 JSONObject
            JSONObject jsonObject = new JSONObject(jsonString);
            // 直接从 JSONObject 中获取数据
            String name = jsonObject.getString("name");
            int age = jsonObject.getInt("age");
            boolean isStudent = jsonObject.getBoolean("isStudent");
            System.out.println("姓名: " + name);
            System.out.println("年龄: " + age);
            // 获取内部的 JSON 对象
            JSONObject addressJson = jsonObject.getJSONObject("address");
            String city = addressJson.getString("city");
            System.out.println("城市: " + city);
            // 获取内部的 JSON 数组
            JSONArray coursesJson = jsonObject.getJSONArray("courses");
            System.out.print("课程: ");
            for (int i = 0; i < coursesJson.length(); i++) {
                System.out.print(coursesJson.getString(i) + " ");
            }
            System.out.println();
        } catch (Exception e) {
            System.err.println("JSON 解析失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

总结与对比

特性 Jackson Gson org.json
流行度 极高 (Spring Boot 默认) (Google 官方) 一般 (轻量级)
易用性 中等 (功能强大,配置稍多) 非常简单 简单 (直接操作)
灵活性 极高 (注解丰富,复杂场景处理能力强) 较低 (适合简单结构)
性能 非常快 较快
是否需要POJO (推荐) (推荐) (直接操作)
主要场景 企业级应用,复杂对象映射,需要高性能 快速开发,简单场景,Android 开发 处理简单、动态的 JSON,无需定义类

如何选择?

  • 如果你在使用 Spring Boot 或开发大型企业应用直接选择 Jackson,它是事实上的标准,与生态系统集成得最好,功能最全面。
  • 如果你只是需要一个简单、快速的 JSON 库,或者不希望引入太多复杂的配置选择 Gson,它的 API 非常直观,上手快。
  • 如果你的 JSON 结构非常简单,或者你只是想快速解析一个 JSON 来获取某个值,不想定义一堆 Java 类选择 org.json,它非常轻量,适合“一次性”的解析任务。

对于绝大多数现代 Java 项目,Jackson 是首选

分享:
扫描分享到社交APP
上一篇
下一篇