如何用Java解析JSON数据:从入门到实践
在当今的软件开发中,JSON(JavaScript Object Notation)已成为数据交换的主流格式之一,其轻量级、易读性强的特点,使其在Web开发、移动应用、微服务等领域广泛应用,Java作为企业级开发的核心语言,如何高效解析JSON数据是开发者必备的技能,本文将详细介绍Java中解析JSON的多种方法,从原生的JSON库到第三方工具(如Gson、Jackson、Fastjson),并结合代码示例帮助读者快速上手。
JSON基础回顾
在开始解析之前,先简单回顾JSON的数据结构:
- 键值对:由键(字符串)和值(字符串、数字、布尔值、数组、对象等)组成,如
{"name": "张三", "age": 25}。 - 数组:值的有序集合,如
[{"id": 1}, {"id": 2}]。 - 值类型:包括字符串(双引号包围)、数字、布尔值(
true/false)、null以及嵌套的对象或数组。
Java解析JSON的常用方法
Java中解析JSON主要分为三类:
- 原生JSON库(Java EE内置,无需额外依赖)
- 第三方库(如Gson、Jackson、Fastjson,功能更强大,使用更灵活)
(一)原生JSON库:javax.json
Java EE 7及以上版本提供了javax.json包(也称为JSON-P),支持JSON的解析和生成,无需添加依赖,可直接使用(需确保环境支持Java EE)。
添加依赖(若使用Maven)
<dependency>
<groupId>javax.json</groupId>
<artifactId>javax.json-api</artifactId>
<version>1.1.4</version>
</dependency>
<!-- 实现类,如Glassfish的JSON-P -->
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.1.4</version>
</dependency>
解析JSON字符串示例
假设有以下JSON字符串:
{
"name": "李四",
"age": 30,
"isStudent": false,
"courses": ["数学", "英语"],
"address": {
"city": "北京",
"district": "海淀区"
}
}
解析代码:
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
import java.io.StringReader;
public class JsonParserExample {
public static void main(String[] args) {
String jsonString = "{\"name\":\"李四\",\"age\":30,\"isStudent\":false,\"courses\":[\"数学\",\"英语\"],\"address\":{\"city\":\"北京\",\"district\":\"海淀区\"}}";
try (JsonReader reader = Json.createReader(new StringReader(jsonString))) {
JsonObject jsonObject = reader.readObject();
// 解析简单字段
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
boolean isStudent = jsonObject.getBoolean("isStudent");
// 解析数组
System.out.println("姓名: " + name);
System.out.println("年龄: " + age);
System.out.println("是否学生: " + isStudent);
// 解析嵌套对象
JsonObject address = jsonObject.getJsonObject("address");
String city = address.getString("city");
String district = address.getString("district");
System.out.println("地址: " + city + " " + district);
// 解析数组
System.out.println("课程: ");
jsonObject.getJsonArray("courses").forEach(item -> {
System.out.println(" - " + item.toString());
});
}
}
}
优缺点
- 优点:无需额外依赖,适合简单场景。
- 缺点:功能有限,解析复杂JSON时代码冗长,错误处理不够灵活。
(二)第三方库1:Gson(Google出品)
Gson是Google开发的JSON库,支持Java对象与JSON之间的相互转换,使用简单,适合新手。
添加依赖(Maven)
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
解析JSON字符串示例
方式1:直接解析为JsonObject(类似原生JSON-P)
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class GsonExample1 {
public static void main(String[] args) {
String jsonString = "{\"name\":\"王五\",\"age\":25,\"isStudent\":true}";
JsonObject jsonObject = JsonParser.parseString(jsonString).getAsJsonObject();
String name = jsonObject.get("name").getAsString();
int age = jsonObject.get("age").getAsInt();
boolean isStudent = jsonObject.get("isStudent").getAsBoolean();
System.out.println("姓名: " + name);
System.out.println("年龄: " + age);
System.out.println("是否学生: " + isStudent);
}
}
方式2:解析为Java对象(更常用)
首先定义与JSON结构对应的Java类:
public class Person {
private String name;
private int age;
private boolean isStudent;
// 必须有无参构造器
public Person() {}
// getter和setter
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; }
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + ", isStudent=" + isStudent + "}";
}
}
解析代码:
import com.google.gson.Gson;
public class GsonExample2 {
public static void main(String[] args) {
String jsonString = "{\"name\":\"王五\",\"age\":25,\"isStudent\":true}";
Gson gson = new Gson();
Person person = gson.fromJson(jsonString, Person.class);
System.out.println(person); // 输出: Person{name='王五', age=25, isStudent=true}
}
}
优缺点
- 优点:API简洁,支持对象与JSON自动转换,适合复杂场景。
- 缺点:对于泛型集合(如
List<Person>)需要额外处理类型。
(三)第三方库2:Jackson(Spring Boot默认选择)
Jackson是功能强大的JSON库,广泛用于Spring Boot等框架,支持流式解析、数据绑定等高级特性。
添加依赖(Maven)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
解析JSON字符串示例
方式1:解析为JsonNode(灵活处理未知结构)
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonExample1 {
public static void main(String[] args) throws Exception {
String jsonString = "{\"name\":\"赵六\",\"age\":28,\"isStudent\":false,\"courses\":[\"物理\",\"化学\"]}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(jsonString);
// 解析字段
String name = jsonNode.get("name").asText();
int age = jsonNode.get("age").asInt();
System.out.println("姓名: " + name + ", 年龄: " + age);
// 解析数组
System.out.println("课程: ");
jsonNode.withArray("courses").forEach(course -> {
System.out.println(" - " + course.asText());
});
}
}
方式2:解析为Java对象(类似Gson)
使用与Gson相同的Person类,解析代码如下:
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonExample2 {
public static void main(String[] args) throws Exception {
String jsonString = "{\"name\":\"赵六\",\"age\":28,\"isStudent\":false}";
ObjectMapper objectMapper = new ObjectMapper();
Person person = objectMapper.readValue(jsonString, Person.class);
System.out.println(person); // 输出: Person{name='赵六', age=28, isStudent=false}
}
}
处理复杂场景(如嵌套对象和数组)
假设JSON包含嵌套对象和数组:
{
"id": 1,
"name": "产品A",
"details": {
"weight": "500g",
"color": "红色"
},
"tags": ["热销", "新品"]
}
定义对应的Java类:
public class Product {
private int id;
private String name;
private Detail details


还没有评论,来说两句吧...