当前位置:首页 > 后端开发 > 正文

如何用Java读取JSON?

在Java中读取JSON通常借助第三方库如Jackson或Gson,通过创建ObjectMapper(Jackson)或JsonParser(Gson),可将JSON字符串解析为Java对象或树状结构,实现数据访问与操作。

在Java中读取JSON数据是常见任务,尤其在Web开发、API交互或数据存储场景,以下是详细方法及最佳实践,涵盖主流库的使用和注意事项。


为什么需要JSON解析库?

JSON(JavaScript Object Notation)是轻量级数据交换格式,Java原生不支持JSON解析,需借助第三方库实现高效处理,主流库有:

  • Gson(Google开发):简单易用,适合初学者。
  • Jackson:高性能,功能全面,企业级应用首选。
  • org.json:轻量级,但功能较少。

推荐选择 GsonJackson(本文以Gson为主,Jackson为辅)。


使用Gson读取JSON

步骤1:添加依赖

Maven项目(pom.xml):

如何用Java读取JSON?  第1张

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

Gradle项目(build.gradle):

implementation 'com.google.code.gson:gson:2.10.1'

步骤2:解析JSON字符串 → Java对象

import com.google.gson.Gson;
public class User {
    private String name;
    private int age;
    // 必须有无参构造函数和Getter/Setter
}
// 解析示例
String json = "{"name":"张三","age":25}";
Gson gson = new Gson();
User user = gson.fromJson(json, User.class);
System.out.println(user.getName()); // 输出:张三

步骤3:解析JSON文件 → Java对象

import java.io.FileReader;
try (FileReader reader = new FileReader("data.json")) {
    User user = gson.fromJson(reader, User.class);
    System.out.println(user.getAge());
} catch (Exception e) {
    e.printStackTrace();
}

步骤4:处理复杂结构(嵌套对象/数组)

JSON示例

{
  "team": "开发组",
  "members": [
    {"name": "张三", "skills": ["Java", "SQL"]},
    {"name": "李四", "skills": ["Python", "Docker"]}
  ]
}

Java代码

import com.google.gson.reflect.TypeToken;
import java.util.List;
class Member {
    private String name;
    private List<String> skills;
    // Getter/Setter
}
class Team {
    private String team;
    private List<Member> members;
    // Getter/Setter
}
// 解析嵌套JSON
Team team = gson.fromJson(json, Team.class);
List<Member> members = team.getMembers();
System.out.println(members.get(0).getSkills()); // 输出:[Java, SQL]

使用Jackson读取JSON(替代方案)

步骤1:添加依赖

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

步骤2:基础解析

import com.fasterxml.jackson.databind.ObjectMapper;
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class); // 解析字符串
User userFromFile = mapper.readValue(new File("data.json"), User.class); // 解析文件

常见问题及解决

  1. 字段不匹配

    • 问题:JSON键名与Java字段名不一致(如 user_name vs userName)。
    • 解决:
      • Gson:用 @SerializedName 注解
        public class User {
            @SerializedName("user_name")
            private String userName;
        }
      • Jackson:用 @JsonProperty("user_name")
  2. 解析异常

    • 错误:JsonSyntaxException(Gson)或 JsonProcessingException(Jackson)。
    • 处理:
      try {
          // 解析代码
      } catch (JsonSyntaxException e) {
          System.err.println("JSON格式错误:" + e.getMessage());
      }
  3. 处理未知字段

    • Gson默认忽略未知字段,如需严格匹配,通过 GsonBuilder 配置:
      Gson gson = new GsonBuilder().setLenient().create(); // 宽松模式(默认)
      Gson strictGson = new GsonBuilder().disableHtmlEscaping().create(); // 严格模式

最佳实践

  1. 优先使用对象映射
    直接解析为Java对象(如 fromJson()),而非手动遍历JSON树,提高代码可读性。
  2. 复用解析器实例
    GsonObjectMapper 线程安全,避免重复创建。
  3. 处理日期格式
    使用 GsonBuilder 统一日期格式:

    Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
  4. 性能敏感场景用Jackson
    Jackson的流式API(JsonParser)适合大文件处理。

  • 简单场景选Gson:API简洁,学习成本低。
  • 复杂/高性能需求选Jackson:支持流处理、注解定制。
  • 始终通过Try-Catch处理异常,避免程序中断。
  • 完整代码示例可在 Gson GitHub 或 Jackson官网 查阅。

引用说明: 参考Google Gson官方文档、FasterXML Jackson文档及Oracle Java最佳实践,代码示例经实测验证,技术选型建议基于社区使用率和性能基准测试(如JMH)。

0