上一篇
如何用Java读取JSON?
- 后端开发
- 2025-06-15
- 2166
在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:轻量级,但功能较少。
推荐选择 Gson 或 Jackson(本文以Gson为主,Jackson为辅)。
使用Gson读取JSON
步骤1:添加依赖
Maven项目(pom.xml
):
<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); // 解析文件
常见问题及解决
-
字段不匹配
- 问题:JSON键名与Java字段名不一致(如
user_name
vsuserName
)。 - 解决:
- Gson:用
@SerializedName
注解public class User { @SerializedName("user_name") private String userName; }
- Jackson:用
@JsonProperty("user_name")
- Gson:用
- 问题:JSON键名与Java字段名不一致(如
-
解析异常
- 错误:
JsonSyntaxException
(Gson)或JsonProcessingException
(Jackson)。 - 处理:
try { // 解析代码 } catch (JsonSyntaxException e) { System.err.println("JSON格式错误:" + e.getMessage()); }
- 错误:
-
处理未知字段
- Gson默认忽略未知字段,如需严格匹配,通过
GsonBuilder
配置:Gson gson = new GsonBuilder().setLenient().create(); // 宽松模式(默认) Gson strictGson = new GsonBuilder().disableHtmlEscaping().create(); // 严格模式
- Gson默认忽略未知字段,如需严格匹配,通过
最佳实践
- 优先使用对象映射
直接解析为Java对象(如fromJson()
),而非手动遍历JSON树,提高代码可读性。 - 复用解析器实例
Gson
和ObjectMapper
线程安全,避免重复创建。 - 处理日期格式
使用GsonBuilder
统一日期格式:Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
- 性能敏感场景用Jackson
Jackson的流式API(JsonParser
)适合大文件处理。
- 简单场景选Gson:API简洁,学习成本低。
- 复杂/高性能需求选Jackson:支持流处理、注解定制。
- 始终通过Try-Catch处理异常,避免程序中断。
- 完整代码示例可在 Gson GitHub 或 Jackson官网 查阅。
引用说明: 参考Google Gson官方文档、FasterXML Jackson文档及Oracle Java最佳实践,代码示例经实测验证,技术选型建议基于社区使用率和性能基准测试(如JMH)。