Java处理JSON的全面指南:从基础到实战
在当今的软件开发中,JSON(JavaScript Object Notation)已成为数据交换的主流格式之一,无论是前后端数据交互、API调用,还是配置文件存储,JSON都凭借其轻量、易读、易解析的特性被广泛应用,Java作为企业级开发的核心语言,处理JSON数据的能力已成为开发者必备技能,本文将系统介绍Java中处理JSON的多种方式,从内置库到第三方工具,帮助读者不同场景下的JSON处理技巧。
JSON与Java的天然映射关系
在学习具体处理方法前,我们需要明确JSON数据与Java对象的对应关系,JSON的核心结构包括两种类型:
- 对象(Object):键值对集合,格式为
{"key1": value1, "key2": value2},对应Java中的Map或自定义对象(POJO)。 - 数组(Array):有序值列表,格式为
[value1, value2, value3],对应Java中的List或数组。
基本数据类型的映射关系为:JSON的string→Java的String,number→Integer/Double等数值类型,boolean→Boolean,null→null,理解这种映射关系,是后续JSON序列化(对象转JSON)与反序列化(JSON转对象)的基础。
Java内置JSON处理方式
Java标准库从版本1.8开始逐步引入JSON支持,虽然功能不如第三方库强大,但在简单场景下足以满足需求。
javax.json(Java EE内置)
Java EE 7及以上版本提供了javax.json包,支持JSON的解析和生成,该包包含两个核心API:JsonReader(读取JSON)和JsonWriter(生成JSON)。
示例:解析JSON字符串并生成JSON
import javax.json.*;
import java.io.StringReader;
import java.io.StringWriter;
public class JavaxJsonExample {
public static void main(String[] args) {
// JSON字符串
String jsonStr = "{\"name\":\"张三\",\"age\":30,\"hobbies\":[\"阅读\",\"编程\"]}";
// 解析JSON(反序列化)
JsonReader reader = Json.createReader(new StringReader(jsonStr));
JsonObject jsonObject = reader.readObject();
reader.close();
// 获取数据
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
JsonArray hobbies = jsonObject.getJsonArray("hobbies");
System.out.println("姓名: " + name);
System.out.println("年龄: " + age);
System.out.println("爱好: " + hobbies.getString(0) + ", " + hobbies.getString(1));
// 生成JSON(序列化)
JsonObjectBuilder builder = Json.createObjectBuilder();
builder.add("name", "李四")
.add("age", 25)
.add("hobbies", Json.createArrayBuilder().add("音乐").add("运动"));
JsonObject newJsonObject = builder.build();
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = Json.createWriter(stringWriter);
jsonWriter.write(newJsonObject);
jsonWriter.close();
System.out.println("新生成的JSON: " + stringWriter.toString());
}
}
特点:无需额外依赖,适合轻量级场景;但API相对繁琐,不支持复杂对象映射(如直接转POJO)。
org.json(第三方库,但常被视为“准内置”)
org.json是一个轻量级开源库,虽然不属于Java标准库,但因使用简单、无需额外配置(很多环境已预装),被广泛使用,它提供了JSONObject和JSONArray等核心类。
示例:使用org.json处理JSON
import org.json.JSONArray;
import org.json.JSONObject;
public class OrgJsonExample {
public static void main(String[] args) {
// JSON字符串转JSONObject
String jsonStr = "{\"name\":\"王五\",\"age\":28,\"hobbies\":[\"旅行\",\"摄影\"]}";
JSONObject jsonObject = new JSONObject(jsonStr);
// 获取数据
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
JSONArray hobbies = jsonObject.getJSONArray("hobbies");
System.out.println("姓名: " + name);
System.out.println("年龄: " + age);
System.out.println("爱好: " + hobbies.get(0) + ", " + hobbies.get(1));
// 构建JSON
JSONObject newJsonObject = new JSONObject();
newJsonObject.put("name", "赵六");
newJsonObject.put("age", 32);
newJsonObject.put("hobbies", new JSONArray().put("游戏").put("美食"));
System.out.println("新生成的JSON: " + newJsonObject.toString());
}
}
特点:API简洁直观,适合手动构建和解析JSON;但同样不支持直接与POJO互转,需手动处理字段映射。
主流第三方JSON库
在实际开发中,尤其是处理复杂对象结构时,第三方JSON库因功能强大、易用性更优而成为首选,以下是当前最流行的三大库:Gson、Jackson、Fastjson。
Gson:Google出品的JSON库
Gson是Google开发的JSON库,支持将Java对象转换为JSON字符串(序列化),以及将JSON字符串转换为Java对象(反序列化),且能很好地处理复杂对象(如嵌套对象、泛型集合)。
核心依赖(Maven):
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
示例:POJO与JSON互转
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
// 定义POJO
class User {
private String name;
private int age;
private List<String> hobbies;
// 必须提供无参构造器(反序列化时需要)
public User() {}
// 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 List<String> getHobbies() { return hobbies; }
public void setHobbies(List<String> hobbies) { this.hobbies = hobbies; }
@Override
public String toString() {
return "User{name='" + name + "', age=" + age + ", hobbies=" + hobbies + "}";
}
}
public class GsonExample {
public static void main(String[] args) {
Gson gson = new Gson();
// 1. 序列化:User对象转JSON字符串
User user = new User();
user.setName("钱七");
user.setAge(35);
List<String> hobbies = new ArrayList<>();
hobbies.add("钓鱼");
hobbies.add("书法");
user.setHobbies(hobbies);
String jsonStr = gson.toJson(user);
System.out.println("序列化结果: " + jsonStr);
// 2. 反序列化:JSON字符串转User对象
String jsonStr2 = "{\"name\":\"孙八\",\"age\":40,\"hobbies\":[\"绘画\",\"瑜伽\"]}";
User user2 = gson.fromJson(jsonStr2, User.class);
System.out.println("反序列化结果: " + user2);
// 3. 处理复杂集合(如List<User>)
String jsonListStr = "[{\"name\":\"周九\",\"age\":22,\"hobbies\":[\"跑步\"]},{\"name\":\"吴十\",\"age\":27,\"hobbies\":[\"唱歌\",\"跳舞\"]}]";
Type userListType = new TypeToken<List<User>>() {}.getType();
List<User> userList = gson.fromJson(jsonListStr, userListType);
System.out.println("用户列表: " + userList);
}
}
特点:
- API简单,
toJson()和fromJson()两个核心方法覆盖大部分场景; - 支持泛型、注解(如
@SerializedName自定义字段名); - 对复杂嵌套对象支持良好,无需手动处理字段映射。
Jackson:高性能JSON库
Jackson是当前Java生态中最流行的JSON库,被Spring、MyBatis等主流框架广泛使用,其性能优异、功能全面,支持流式解析(适合大文件)、注解配置、数据绑定等。
核心依赖(Maven):
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
示例:使用Jackson处理JSON
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
// 复用上面的User类
public class JacksonExample {
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
// 1. 序列


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