Java中构造JSON的实用指南:从基础到进阶
在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,广泛应用于前后端数据交互、配置文件存储、API响应等场景,如何在Java中高效、灵活地构造JSON数据,是开发者必备的技能,本文将介绍Java构造JSON的主流方法,从原生操作到第三方库,涵盖不同场景下的实践方案。
Java构造JSON的常见方式
Java本身没有内置的JSON构造类,因此需要借助第三方库或手动拼接字符串来实现,目前主流的方案包括:手动拼接字符串、使用Jackson库、使用Gson库、使用org.json库,下面将逐一展开讲解。
手动拼接JSON字符串(基础但不推荐)
最直接的方式是通过字符串拼接构造JSON,适用于结构极其简单的场景,但这种方式存在明显缺点:可读性差、容易出错(如缺少引号、逗号)、难以处理复杂嵌套结构。
示例:
public class ManualJsonExample {
public static void main(String[] args) {
// 构造简单的JSON对象:{"name":"张三","age":25,"isStudent":true}
String json = "{\"name\":\"张三\",\"age\":25,\"isStudent\":true}";
// 构造带数组的JSON:{"hobbies":["篮球","编程"],"city":"北京"}
String jsonWithArray = "{\"hobbies\":[\"篮球\",\"编程\"],\"city\":\"北京\"}";
System.out.println("简单JSON对象: " + json);
System.out.println("带数组的JSON: " + jsonWithArray);
}
}
缺点:
- 需要手动处理转义字符(如需写成
\"); - 嵌套层级深时,代码可读性极差;
- 无法验证JSON格式正确性,运行时可能因语法错误抛出异常。
使用Jackson库(企业级首选)
Jackson是Java生态中最流行的JSON处理库之一,高性能、功能强大,支持JSON与Java对象的相互转换、流式处理、树模型等,Spring框架默认使用Jackson处理HTTP请求/响应的JSON数据。
添加依赖(Maven)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version> <!-- 建议使用最新版本 -->
</dependency>
核心API:ObjectMapper与JsonNode
Jackson通过ObjectMapper类实现JSON操作,支持两种构造方式:
- 对象绑定:将Java对象序列化为JSON(需定义POJO);
- 树模型:类似XML的DOM,通过
JsonNode节点动态构造JSON(无需POJO,更灵活)。
(1)通过POJO构造JSON(对象绑定)
定义Java实体类,通过ObjectMapper的writeValueAsString()方法转换为JSON字符串。
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
// 1. 定义POJO类
class User {
private String name;
private int age;
private boolean isStudent;
private String[] hobbies;
// 必须提供无参构造器(Jackson反射需要)
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 boolean isStudent() { return isStudent; }
public void setStudent(boolean student) { isStudent = student; }
public String[] getHobbies() { return hobbies; }
public void setHobbies(String[] hobbies) { this.hobbies = hobbies; }
}
public class JacksonPOJOExample {
public static void main(String[] args) throws JsonProcessingException {
// 2. 创建User对象并赋值
User user = new User();
user.setName("李四");
user.setAge(30);
user.setStudent(false);
user.setHobbies(new String[]{"阅读", "旅行"});
// 3. 使用ObjectMapper转换为JSON字符串
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
System.out.println("通过POJO构造的JSON: " + json);
// 输出: {"name":"李四","age":30,"isStudent":false,"hobbies":["阅读","旅行"]}
}
}
(2)通过树模型动态构造JSON(无需POJO)
JsonNode是Jackson的树模型核心,可通过ObjectMapper的createObjectNode()创建节点,动态添加字段和数组。
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
public class JacksonTreeModelExample {
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
// 1. 创建JSON对象节点(相当于{})
ObjectNode userNode = mapper.createObjectNode();
// 2. 添加字段(put方法支持多种类型)
userNode.put("name", "王五");
userNode.put("age", 28);
userNode.put("isStudent", true);
// 3. 添加数组字段
ArrayNode hobbiesNode = mapper.createArrayNode();
hobbiesNode.add("音乐").add("摄影"); // 链式调用
userNode.set("hobbies", hobbiesNode);
// 4. 转换为JSON字符串
String json = mapper.writeValueAsString(userNode);
System.out.println("通过树模型构造的JSON: " + json);
// 输出: {"name":"王五","age":28,"isStudent":true,"hobbies":["音乐","摄影"]}
}
}
Jackson优势:
- 高性能(基于流式处理,适合大数据量);
- 与Spring等框架深度集成;
- 支持注解(如
@JsonProperty、@JsonIgnore)灵活控制JSON字段。
使用Gson库(Google出品,简洁易用)
Gson是Google开发的JSON库,以简洁的API和强大的Java对象转换能力著称,尤其适合无需复杂配置的场景。
添加依赖(Maven)
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- 建议使用最新版本 -->
</dependency>
核心API:Gson与JsonElement
Gson通过Gson类操作JSON,支持对象绑定和树模型(JsonElement,包含JsonObject、JsonArray等子类)。
(1)通过POJO构造JSON
与Jackson类似,定义POJO后通过Gson的toJson()方法转换。
import com.google.gson.Gson;
// 复用前面定义的User类
public class GsonPOJOExample {
public static void main(String[] args) {
User user = new User();
user.setName("赵六");
user.setAge(22);
user.setStudent(true);
user.setHobbies(new String[]{"游戏", "动漫"});
Gson gson = new Gson();
String json = gson.toJson(user);
System.out.println("通过Gson构造的JSON: " + json);
// 输出: {"name":"赵六","age":22,"isStudent":true,"hobbies":["游戏","动漫"]}
}
}
(2)通过JsonObject动态构造JSON
Gson的JsonObject允许直接添加键值对,无需预定义POJO。
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
public class GsonJsonObjectExample {
public static void main(String[] args) {
JsonObject userJson = new JsonObject();
userJson.addProperty("name", "钱七");
userJson.addProperty("age", 35);
userJson.addProperty("isStudent", false);
JsonArray hobbiesArray = new JsonArray();
hobbiesArray.add("跑步");
hobbiesArray.add("游泳");
userJson.add("hobbies", hobbiesArray);
Gson gson = new Gson();
String json = gson.toJson(userJson);
System.out.println("通过Gson JsonObject构造的JSON: " + json);
// 输出: {"name":"钱七","age":35,"isStudent":false,"hobbies":["跑步","游泳"]}
}
}
Gson优势:
- API直观,学习成本低;
- 默认支持复杂类型(如日期、集合)的转换;
- 可通过
TypeAdapter自定义序列化/反序列化逻辑。
使用org.json库(轻量级,适合简单场景)
org.json是一个轻量级JSON库,API简单,适合构造或解析结构简单的JSON,但功能相对较弱,不支持复杂注解或自定义转换。



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