在Java开发中,处理JSON数据是一项常见且重要的任务,无论是从API接口获取数据,还是解析配置文件,都需要掌握如何从JSON结构中提取所需的值,本文将详细介绍几种主流的Java JSON处理库的使用方法,帮助开发者高效地获取JSON数据。

使用标准库javax.json
Java EE 7及以上版本引入了标准的JSON处理API(javax.json),无需额外依赖即可使用,该API提供了JsonReader、JsonArray和JsonObject等核心类,支持流式解析和DOM解析两种方式。
流式解析
流式解析适用于处理大型JSON文件,因为它不会将整个JSON文档加载到内存中,以下是一个示例代码:
import javax.json.JsonReader;
import javax.json.JsonObject;
import java.io.StringReader;
public class JsonStreamParser {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"张三\",\"age\":30,\"city\":\"北京\"}";
JsonReader reader = Json.createReader(new StringReader(jsonStr));
JsonObject jsonObject = reader.readObject();
reader.close();
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
String city = jsonObject.getString("city");
System.out.println("姓名:" + name);
System.out.println("年龄:" + age);
System.out.println("城市:" + city);
}
}
DOM解析
DOM解析将整个JSON文档加载到内存中,适合处理小型JSON数据,通过JsonObject可以方便地访问各个字段:
import javax.json.JsonObject;
import javax.json.JsonReader;
public class JsonDomParser {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"李四\",\"hobbies\":[\"阅读\",\"旅行\"]}";
JsonReader reader = Json.createReader(new StringReader(jsonStr));
JsonObject jsonObject = reader.readObject();
String name = jsonObject.getString("name");
JsonArray hobbies = jsonObject.getJsonArray("hobbies");
String hobby1 = hobbies.getString(0);
String hobby2 = hobbies.getString(1);
System.out.println("姓名:" + name);
System.out.println("爱好1:" + hobby1);
System.out.println("爱好2:" + hobby2);
}
}
使用第三方库Gson
Google开发的Gson库是Java生态中最流行的JSON处理工具之一,以其简洁的API和强大的功能著称。

基本数据解析
Gson可以直接将JSON字符串转换为Java对象,也可以将Java对象序列化为JSON字符串,以下是一个示例:
import com.google.gson.Gson;
import com.google.gson.JsonObject;
public class GsonParser {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"王五\",\"age\":25,\"isStudent\":true}";
Gson gson = new Gson();
JsonObject jsonObject = gson.fromJson(jsonStr, JsonObject.class);
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);
}
}
复杂对象映射
Gson支持将JSON数据直接映射到自定义的Java类中,这种方式更加面向对象且类型安全:
import com.google.gson.Gson;
class Person {
private String name;
private int age;
private String[] hobbies;
// 必须提供无参构造函数
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 String[] getHobbies() { return hobbies; }
public void setHobbies(String[] hobbies) { this.hobbies = hobbies; }
}
public class GsonObjectMapping {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"赵六\",\"age\":28,\"hobbies\":[\"游泳\",\"摄影\"]}";
Gson gson = new Gson();
Person person = gson.fromJson(jsonStr, Person.class);
System.out.println("姓名:" + person.getName());
System.out.println("年龄:" + person.getAge());
System.out.println("爱好:" + String.join(", ", person.getHobbies()));
}
}
使用第三方库Jackson
Jackson是另一个高性能的JSON处理库,广泛用于Spring框架等大型项目中,与Gson类似,Jackson也提供了丰富的API来处理JSON数据。
基本使用
Jackson的ObjectMapper类是核心组件,用于JSON和Java对象之间的转换:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonParser {
public static void main(String[] args) throws Exception {
String jsonStr = "{\"name\":\"钱七\",\"age\":35,\"city\":\"上海\"}";
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(jsonStr);
String name = rootNode.path("name").asText();
int age = rootNode.path("age").asInt();
String city = rootNode.path("city").asText();
System.out.println("姓名:" + name);
System.out.println("年龄:" + age);
System.out.println("城市:" + city);
}
}
处理复杂JSON
Jackson支持处理嵌套的JSON结构和数组,以下是一个处理复杂JSON的示例:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.JsonNode;
public class JacksonComplexJson {
public static void main(String[] args) throws Exception {
String jsonStr = "{\"user\":{\"name\":\"孙八\",\"contact\":{\"email\":\"sunba@example.com\",\"phone\":\"123456789\"}},\"orders\":[{\"id\":1,\"amount\":100},{\"id\":2,\"amount\":200}]}";
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(jsonStr);
// 获取用户信息
JsonNode userNode = rootNode.path("user");
String userName = userNode.path("name").asText();
String userEmail = userNode.path("contact").path("email").asText();
// 获取订单信息
JsonNode ordersNode = rootNode.path("orders");
for (JsonNode order : ordersNode) {
int orderId = order.path("id").asInt();
double amount = order.path("amount").asDouble();
System.out.println("订单ID:" + orderId + ",金额:" + amount);
}
System.out.println("用户名:" + userName);
System.out.println("邮箱:" + userEmail);
}
}
选择合适的JSON处理库
在选择JSON处理库时,需要根据项目需求进行权衡:
- javax.json:如果项目已经基于Java EE,且不需要额外依赖,可以选择标准API。
- Gson:API简洁易用,适合中小型项目,特别是需要快速实现JSON解析的场景。
- Jackson:性能优异,功能强大,适合大型项目和复杂的JSON处理需求,特别是在Spring框架中集成度高。
注意事项
- 异常处理:JSON解析过程中可能会抛出JsonException或JsonSyntaxException等异常,需要进行适当的异常捕获和处理。
- 空值处理:JSON中可能存在null值,使用get方法时要注意避免NullPointerException。
- 性能考虑:对于大型JSON文件,建议使用流式解析以减少内存消耗。
- 安全性:避免直接解析不可信的JSON数据,防止JSON注入攻击。
通过掌握以上几种JSON处理方法,开发者可以根据实际需求选择最适合的方案,高效地从JSON数据中提取所需的值,无论是简单的键值对还是复杂的嵌套结构,这些工具都能提供灵活且强大的支持。

















