Java中读取JSON数据的常用工具与方法详解
在Java开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其易读性强、解析效率高而被广泛使用,无论是调用第三方API接口、处理配置文件,还是数据持久化,都离不开对JSON数据的读取,本文将详细介绍Java中读取JSON数据的常用工具及其使用方法,帮助开发者根据实际需求选择合适的方案。
Java原生JSON库:无需额外依赖的轻量级选择
Java标准库从JDK 11开始正式内置了javax.json模块(JSON Processing, JSR 374),提供了原生JSON解析能力,无需添加第三方依赖,适合对依赖管理有严格要求的轻量级项目。
核心API介绍
JsonReader:流式读取器,逐字符解析JSON文本,适合处理大文件(避免内存溢出)。JsonParser:事件解析器,类似XML的SAX解析,通过事件回调(如START_OBJECT、END_ARRAY)处理JSON结构。Json.createReader()/Json.createParser():通过JsonReaderFactory或JsonParserFactory创建解析器实例。
代码示例:使用JsonReader读取JSON对象
假设有以下JSON数据:
{
"name": "张三",
"age": 25,
"hobbies": ["篮球", "编程"],
"address": {
"city": "北京",
"district": "海淀区"
}
}
步骤1:创建JsonReader并解析JSON
import javax.json.*;
import java.io.StringReader;
public class JsonReaderExample {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"张三\",\"age\":25,\"hobbies\":[\"篮球\",\"编程\"],\"address\":{\"city\":\"北京\",\"district\":\"海淀区\"}}";
// 通过StringReader创建JsonReader
JsonReader reader = Json.createReader(new StringReader(jsonStr));
// 读取JSON对象
JsonObject jsonObject = reader.readObject();
reader.close(); // 关闭流
// 提取基本类型字段
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
System.out.println("姓名: " + name + ", 年龄: " + age);
// 读取数组字段
JsonArray hobbies = jsonObject.getJsonArray("hobbies");
System.out.print("爱好: ");
hobbies.forEach(item -> System.out.print(item.toString() + " ")); // 输出: 爱好: 篮球 编程
// 读取嵌套对象
JsonObject address = jsonObject.getJsonObject("address");
String city = address.getString("city");
System.out.println("\n城市: " + city); // 输出: 城市: 北京
}
}
优缺点分析
- 优点:无需依赖第三方库,减少项目体积;官方支持,稳定性有保障。
- 缺点:功能相对基础,缺少高级特性(如自动映射到Java对象);错误提示不够友好。
第三方JSON库:功能更丰富的主流选择
实际开发中,更多项目会选择成熟的第三方JSON库,它们提供了更强大的功能(如对象映射、数据校验、格式化等),以下是几种常用工具:
Jackson:高性能JSON处理器
Jackson是Java生态中最流行的JSON库,被Spring、MyBatis等主流框架广泛使用,其核心优势包括高性能、低内存占用、丰富的API,支持JSON与Java对象的相互转换、流式解析、树模型等多种操作。
核心模块
jackson-core:核心包,提供基于“流”(Streaming)的JSON解析/生成API(如JsonParser、JsonGenerator)。jackson-databind:数据绑定包,支持JSON与POJO(普通Java对象)的自动映射,是开发中最常用的模块。jackson-annotations:注解包,提供@JsonProperty、@JsonIgnore等注解,用于定制JSON与对象的映射关系。
代码示例:使用ObjectMapper读取JSON到POJO
步骤1:定义POJO类
public class Person {
private String name;
private int age;
private List<String> hobbies;
private Address address;
// 必须提供无参构造方法(Jackson反射需要)
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 List<String> getHobbies() { return hobbies; }
public void setHobbies(List<String> hobbies) { this.hobbies = hobbies; }
public Address getAddress() { return address; }
public void setAddress(Address address) { this.address = address; }
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + ", hobbies=" + hobbies + ", address=" + address + "}";
}
}
public class Address {
private String city;
private String district;
public Address() {}
// getter/setter
public String getCity() { return city; }
public void setCity(String city) { this.city = city; }
public String getDistrict() { return district; }
public void setDistrict(String district) { this.district = district; }
@Override
public String toString() {
return "Address{city='" + city + "', district='" + district + "'}";
}
}
步骤2:使用ObjectMapper解析JSON
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonExample {
public static void main(String[] args) throws Exception {
String jsonStr = "{\"name\":\"张三\",\"age\":25,\"hobbies\":[\"篮球\",\"编程\"],\"address\":{\"city\":\"北京\",\"district\":\"海淀区\"}}";
// 创建ObjectMapper实例
ObjectMapper objectMapper = new ObjectMapper();
// 将JSON字符串解析为Person对象
Person person = objectMapper.readValue(jsonStr, Person.class);
// 输出结果
System.out.println(person);
// 输出: Person{name='张三', age=25, hobbies=[篮球, 编程], address=Address{city='北京', district='海淀区'}}
}
}
其他常用功能
- 读取JSON数组:
objectMapper.readValue(jsonStr, new TypeReference<List<Person>>() {}); - 流式读取(大文件):通过
JsonParser逐行解析,避免内存溢出。 - 注解定制:如
@JsonProperty("user_name")指定JSON字段名,@JsonIgnore忽略字段。
优缺点分析
- 优点:性能极高(比Gson快约20%);功能全面(支持流、树、模型多种解析方式);生态完善,与Spring等框架深度集成。
- 缺点:API相对复杂,学习成本略高;默认严格模式(如JSON字段必须与POJO属性完全匹配,否则报错)。
Gson:Google开发的JSON库
Gson是Google推出的JSON处理工具,以简单易用、API直观著称,特别适合中小型项目或需要快速集成JSON解析的场景。
核心特性
- 支持JSON与Java对象的相互转换。
- 支持复杂对象(泛型、嵌套对象、集合)的解析。
- 提供
JsonParser(树模型)和GsonBuilder(定制化配置)等工具。
代码示例:使用Gson读取JSON到POJO
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.List;
public class GsonExample {
public static void main(String[] args) {
String jsonStr = "{\"name\":\"张三\",\"age\":25,\"hobbies\":[\"篮球\",\"编程\"],\"address\":{\"city\":\"北京\",\"district\":\"海淀区\"}}";
// 创建Gson实例
Gson gson = new Gson();
// 解析为Person对象
Person person = gson.fromJson(jsonStr, Person.class);
System.out.println("对象解析: " + person);
// 解析JSON数组(示例:解析List<String>)
String jsonArrayStr = "[\"篮球\", \"编程\", \"读书\"]";
Type listType = new TypeToken<List<String>>() {}.getType();
List<String> hobbies = gson.fromJson(jsonArrayStr, listType);
System.out.println("数组解析: " + hobbies); // 输出: [篮球, 编程, 读书]
}
}
优缺点分析
- 优点:API简单直观,学习成本低;对泛型、嵌套对象支持友好;默认宽松模式(JSON字段缺失不会报错,而是使用默认值)。
- 缺点:性能略逊于Jackson(尤其是处理大文件时);



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