Java中JSON解析全攻略:从入门到精通
在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其简洁、易读、易解析的特性,已成为前后端数据交互、API接口响应、配置文件存储等场景的标配,无论是从后端接收HTTP响应数据,还是读取本地JSON配置文件,都离不开对JSON的解析,本文将详细介绍Java中主流的JSON解析方式,包括原生JSON库、Gson、Jackson、Fastjson等,并通过代码示例演示其核心用法,帮助开发者快速JSON解析技巧。
Java中JSON解析的核心概念
什么是JSON?
JSON是一种基于文本的数据格式,采用键值对(Key-Value)的形式存储数据,结构清晰,易于人阅读和机器解析,其基本结构包括:
- 对象(Object):用 表示,包含多个键值对,如
{"name":"张三", "age":18}。 - 数组(Array):用
[]表示,包含多个有序值,如[{"name":"李四"}, {"name":"王五"}]。 - 值(Value):可以是字符串、数字、布尔值、null、对象或数组。
为什么需要JSON解析工具?
Java原生没有直接支持JSON的类库,而JSON字符串与Java对象之间的转换需要借助第三方工具,这些工具能将JSON字符串解析为Java对象(反序列化),或将Java对象转换为JSON字符串(序列化),简化开发流程。
Java原生JSON解析(JDK 11+)
从Java 11开始,标准库中新增了javax.json包(需引入jakarta.json依赖,Java EE 8+版本),支持基本的JSON解析,虽然功能不如第三方库强大,但无需额外依赖,适合简单场景。
添加依赖(Maven)
<dependency>
<groupId>jakarta.json</groupId>
<artifactId>jakarta.json-api</artifactId>
<version>2.1.1</version>
</dependency>
<!-- 实现类(如Eclipse Jersey) -->
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>jakarta.json</artifactId>
<version>2.0.1</version>
</dependency>
核心API与示例
(1)解析JSON字符串为JsonObject
import jakarta.json.JsonObject;
import jakarta.json.JsonReader;
import java.io.StringReader;
public class NativeJsonParse {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"张三\", \"age\":18, \"isStudent\":true}";
try (JsonReader reader = Json.createReader(new StringReader(jsonStr))) {
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);
}
}
}
(2)解析JSON数组为JsonArray
import jakarta.json.JsonArray;
import jakarta.json.JsonReader;
import java.io.StringReader;
public class JsonArrayParse {
public static void main(String[] args) {
String jsonArrStr = "[{\"name\":\"李四\"}, {\"name\":\"王五\"}]";
try (JsonReader reader = Json.createReader(new StringReader(jsonArrStr))) {
JsonArray jsonArray = reader.readArray();
for (int i = 0; i < jsonArray.size(); i++) {
JsonObject obj = jsonArray.getJsonObject(i);
System.out.println("姓名: " + obj.getString("name"));
}
}
}
}
(3)将Java对象转换为JSON字符串
import jakarta.json.JsonObject;
import jakarta.json.JsonWriter;
import java.io.StringWriter;
public class JsonSerialize {
public static void main(String[] args) {
JsonObject jsonObject = Json.createObjectBuilder()
.add("name", "赵六")
.add("age", 20)
.add("isStudent", false)
.build();
try (StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = Json.createWriter(stringWriter)) {
jsonWriter.write(jsonObject);
String jsonStr = stringWriter.toString();
System.out.println("生成的JSON: " + jsonStr);
}
}
}
优缺点
- 优点:无需额外依赖,适合简单JSON解析。
- 缺点:功能有限,不支持注解、复杂对象映射,开发效率低。
第三方JSON解析库
Gson(Google官方推荐)
Gson是Google开源的JSON库,支持将Java对象转换为JSON字符串,反之亦然,且支持复杂对象映射和泛型。
(1)添加依赖(Maven)
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
(2)核心用法
① JSON字符串转Java对象
import com.google.gson.Gson;
public class GsonParse {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"张三\", \"age\":18}";
Gson gson = new Gson();
User user = gson.fromJson(jsonStr, User.class);
System.out.println("姓名: " + user.name);
System.out.println("年龄: " + user.age);
}
static class User {
public String name;
public int age;
// 无参构造方法(Gson反射需要)
public User() {}
}
}
② Java对象转JSON字符串
import com.google.gson.Gson;
public class GsonSerialize {
public static void main(String[] args) {
User user = new User();
user.name = "李四";
user.age = 20;
Gson gson = new Gson();
String jsonStr = gson.toJson(user);
System.out.println("生成的JSON: " + jsonStr);
}
static class User {
public String name;
public int age;
}
}
③ 处理复杂JSON(嵌套对象、数组)
import com.google.gson.Gson;
import java.util.List;
import java.util.Arrays;
public class GsonComplexParse {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"王五\", \"hobbies\":[\"篮球\",\"阅读\"], \"address\":{\"city\":\"北京\"}}";
Gson gson = new Gson();
ComplexUser user = gson.fromJson(jsonStr, ComplexUser.class);
System.out.println("姓名: " + user.name);
System.out.println("爱好: " + user.hobbies);
System.out.println("城市: " + user.address.city);
}
static class ComplexUser {
public String name;
public List<String> hobbies;
public Address address;
}
static class Address {
public String city;
}
}
(3)Gson注解
Gson提供了丰富的注解,用于灵活控制JSON与Java对象的映射关系:
@SerializedName:指定JSON字段与Java字段的映射名称。@Expose:控制字段是否参与序列化/反序列化。@Since:指定版本号,控制字段在特定版本后是否生效。
import com.google.gson.annotations.SerializedName;
import com.google.gson.annotations.Expose;
public class GsonAnnotationExample {
@Expose
@SerializedName("user_name") // JSON字段名为"user_name",Java字段名为"name"
private String name;
private int age; // 不使用@Expose,默认不参与序列化
// 省略getter/setter
}
// 使用GsonBuilder配置注解
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
String json = gson.toJson(new GsonAnnotationExample());
Jackson(Spring Boot默认使用)
Jackson是功能最强大的JSON库之一,广泛应用于Spring Boot、微服务等框架,支持高性能解析、流式处理、注解配置等。
(1)添加依赖(Maven)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
(2)核心用法
① JSON字符串转Java对象
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonParse {
public static void main(String[] args) throws Exception {
String jsonStr = "{\"name\":\"张三\", \"age\":18}";
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(jsonStr, User.class);
System.out.println("姓名: " + user.name);
System.out.println("年龄: " + user.age);
}
static class User {
private String name;
private int age;
// �


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