Java如何解析JSON串:从基础到实践的全面指南
在当今的软件开发中,JSON(JavaScript Object Notation)已成为轻量级数据交换的主流格式,无论是前后端接口交互、配置文件解析,还是第三方服务数据对接,都离不开JSON的身影,Java作为企业级开发的核心语言,如何高效、灵活地解析JSON串是开发者必备的技能,本文将系统介绍Java中解析JSON的主流方法,从内置库到第三方工具,结合代码示例和场景分析,帮助读者JSON解析的核心技术。
JSON解析的核心需求
在具体方法前,我们先明确JSON解析的核心任务:将JSON格式的字符串转换为Java可识别的对象(如Map、List或自定义实体类),反之亦然,这一过程涉及两个关键操作:解析(Parsing)和序列化(Serialization),本文重点聚焦“解析”,即从字符串到Java对象的转换。
Java解析JSON的主流方法
Java生态中提供了多种JSON解析方案,大致可分为三类:
- 内置库(如
javax.json、org.json) - 第三方工具库(如Gson、Jackson、Fastjson)
- JDK 11+ 新特性(
java.net.http.HttpClient结合JSON处理)
下面将逐一展开介绍。
1 使用Java内置库解析JSON
1.1 javax.json(Jakarta JSON API)
javax.json是Java EE(现为Jakarta EE)提供的标准JSON处理API,无需额外依赖,功能覆盖JSON解析和生成,但需注意,Java SE环境中需手动引入实现(如org.glassfish:jakarta.json)。
核心类:
JsonReader:读取JSON并生成对象模型(如JsonArray、JsonObject)。JsonParser:流式解析,逐字符读取JSON,适合大文件处理。
示例代码:
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
import java.io.StringReader;
public class JavaxJsonExample {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"张三\",\"age\":30,\"hobbies\":[\"阅读\",\"编程\"]}";
try (JsonReader reader = Json.createReader(new StringReader(jsonStr))) {
JsonObject jsonObject = reader.readObject();
// 解析简单字段
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
System.out.println("姓名: " + name + ", 年龄: " + age);
// 解析数组字段
System.out.print("爱好: ");
jsonObject.getJsonArray("hobbies").forEach(item ->
System.out.print(item.toString() + " ")
);
}
}
}
特点:
- 优点:标准API,无需额外依赖;支持对象模型和流式解析两种模式。
- 缺点:功能相对基础,需手动处理类型转换;Java SE中需引入额外依赖。
1.2 org.json(第三方但常被视为“准内置”)
org.json是一个轻量级JSON库,虽非JDK内置,但因使用简单、无需复杂配置,被许多项目(如Android开发)广泛使用,需通过Maven引入:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20231013</version>
</dependency>
示例代码:
import org.json.JSONArray;
import org.json.JSONObject;
public class OrgJsonExample {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"李四\",\"age\":25,\"hobbies\":[\"音乐\",\"旅行\"]}";
JSONObject jsonObject = new JSONObject(jsonStr);
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
System.out.println("姓名: " + name + ", 年龄: " + age);
JSONArray hobbies = jsonObject.getJSONArray("hobbies");
System.out.print("爱好: ");
for (int i = 0; i < hobbies.length(); i++) {
System.out.print(hobbies.getString(i) + " ");
}
}
}
特点:
- 优点:API简洁,易于上手;支持JSON与Java基本类型、集合的相互转换。
- 缺点:性能一般;错误处理不够友好(如字段不存在时抛出
JSONException)。
2 使用第三方工具库解析JSON
第三方工具库凭借更强的功能、更好的性能和更灵活的配置,成为企业级开发的首选,主流库包括Gson、Jackson、Fastjson等。
2.1 Gson(Google JSON库)
Gson是Google开发的JSON库,支持Java对象与JSON字符串的双向转换,尤其擅长处理复杂对象(如嵌套对象、泛型)。
Maven依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
核心功能:
JsonParser:将JSON字符串解析为JsonElement(树形结构)。Gson.fromJson():直接将JSON字符串转换为Java对象(需自定义实体类)。
示例代码:
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
// 自定义实体类
class Person {
private String name;
private int age;
private String[] hobbies;
// 必需:无参构造器
public Person() {}
// getter/setter(可省略,若使用@SerializedName注解则需保留)
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 String[] getHobbies() { return hobbies; }
public void setHobbies(String[] hobbies) { this.hobbies = hobbies; }
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + ", hobbies=" + String.join(", ", hobbies) + "}";
}
}
public class GsonExample {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"王五\",\"age\":28,\"hobbies\":[\"摄影\",\"健身\"]}";
// 方式1:直接转换为Java对象(需实体类)
Gson gson = new Gson();
Person person = gson.fromJson(jsonStr, Person.class);
System.out.println("对象解析: " + person);
// 方式2:使用JsonParser解析为JsonElement(灵活处理动态字段)
JsonElement jsonElement = JsonParser.parseString(jsonStr);
String name = jsonElement.getAsJsonObject().get("name").getAsString();
System.out.println("动态解析姓名: " + name);
}
}
特点:
- 优点:支持复杂对象映射(如泛型、注解自定义字段名);API直观,适合快速开发。
- 缺点:性能略逊于Jackson;对大JSON的内存占用较高。
2.2 Jackson(高性能JSON库)
Jackson是Java生态中最流行的JSON库,被Spring Boot、Spring Cloud等主流框架默认集成,其性能优异、功能全面,支持流式解析、数据绑定等多种模式。
Maven依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
核心功能:
ObjectMapper:核心类,实现Java对象与JSON的相互转换。JsonParser:流式解析器,逐 token 读取JSON,适合大文件。JsonGenerator:JSON生成器,用于将对象写入输出流。
示例代码:
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
// 复用上面的Person类
public class JacksonExample {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"赵六\",\"age\":35,\"hobbies\":[\"钓鱼\",\"登山\"]}";
ObjectMapper objectMapper = new ObjectMapper();
try {
// 方式1:转换为自定义对象
Person person = objectMapper.readValue(jsonStr, Person.class);
System.out.println("对象解析: " + person);
// 方式2:解析为JsonNode(树形结构,灵活遍历)
JsonNode jsonNode = objectMapper.readTree(jsonStr);
System.out.println("姓名: " + jsonNode.get("name").asText());
System.out.println("第一个爱好: " + jsonNode.get("hobbies").get(0).asText());
// 方式3:处理复杂JSON(如嵌套对象)
String complexJson = "{\"user\":{\"name\":\"钱七\",\"age\":22},\"roles\":[\"admin


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