JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于阅读和编写,并且与语言无关。在Java中,有多个库可以用来解析和生成JSON,每个库都有其独特的特点和用法。
JSON 取值可以是 object、array、number、string、boolean (true/false) 或null,此外 JSON 值可以是另一个 JSON,也就是支持嵌套。
org.json
JSON-Java库 也称为 org.json(不要与 Google 的org.json.simple混淆)为我们提供了用于在 Java 中解析和操作 JSON 的类。
该库还可以在 JSON、XML、HTTP headers、Cookies、逗号分隔列表或文本等之间进行转换。
添加依赖
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20240303</version>
</dependency>
最新版本可以查看MVN中央仓库。
org.json 关键类
- JSONObject – 类似于 Java 原生的Map类对象,它存储无序的键值对
- JSONArray – 类似于 Java 原生 Vector 实现的有序值序列
- JSONTokener – 一种将一段文本分解为一系列标记的工具, JSONObject或JSONArray可以使用这些来解析 JSON 字符串
- CDL – 一种工具,提供将逗号分隔文本转换为JSONArray 的方法
- Cookie – 从 JSON字符串转换为 cookie
- HTTP – 用于从 JSON字符串转换为 HTTP header
- JSONException – 该库抛出的标准异常
基本用法
org.json 的 JSONObject 非常像 Java 的 Map 接口:
JSONObject jo = new JSONObject();
jo.put("name", "Zhangsan");
jo.put("age", "26");
jo.put("city", "Shanghai");
得到的JSON 字符串:
{"city":"Shanghai","name":"Zhangsan","age":"26"}
Jackson
Jackson是Java的高性能JSON处理器,其开发人员称赞该库具有快速、正确、轻量级等优势。
添加依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.0</version>
</dependency>
最新版本可以查看MVN中央仓库。
基本用法
public static void main(String[] args) throws IOException {
Student student = new Student();
student.setName("张三");
student.setAge(26);
student.setScore(89.5);
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(System.out, student);
Student value = mapper.readValue("{\"name\":\"张三\",\"age\":26,\"score\":89.5}", Student.class);
}
FastJson
FastJson是一个轻量级 Java 库,用于高效地将 JSON 字符串转换为 Java 对象。
添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.48</version>
</dependency>
最新版本可以查看MVN中央仓库。
基本用法
首先定义一个 Java 实体类 Student.java
。
@Data
public class Student{
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private Integer age;
/**
* 成绩
*/
private Double score;
}
使用 JSON.toJSONString()
将 Java 对象转换为 JSON 字符串:
import com.alibaba.fastjson.JSON;
public static void main(String[] args) {
Student student = new Student();
student.setName("张三");
student.setAge(26);
student.setScore(89.5);
String string = JSON.toJSONString(student);
System.out.println(string);
}
得到的 JSON 格式数据:
{"age":26,"name":"张三","score":89.5}
Gson
添加依赖
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
最新版本可以查看MVN中央仓库
基本用法
json-io
json-io 也是一个无其他外部依赖的 JSON 格式处理库,其本身仅 185KB,加上它自身引用的内部 java-util,也才 250KB。并且支持从 JDk1.8 到 JDK 21 的众多版本。
添加依赖
<dependency>
<groupId>com.cedarsoftware</groupId>
<artifactId>json-io</artifactId>
<version>4.19.13</version>
</dependency>
基本用法
public static void main(String[] args){
Student student = new Student();
student.setName("张三");
student.setAge(26);
student.setScore(89.5);
String jsonStr = JsonIo.toJson(student,writeOptions);
Student result = JsonIo.toObjects(jsonStr,readOptions,Student.class);
}
- JsonIo.toJson 序列化 Object 为 JSON.
- JsonIo.toObjects 反序列化 JSON 为 Java Object.
Genson
Genson 是一个强大的 JSON 解析库,它提供的功能非常多,遗憾的是已经多年没有更新了。
添加依赖
<dependency>
<groupId>com.owlike</groupId>
<artifactId>genson</artifactId>
<version>1.6</version>
</dependency>
当前最新版 1.6 是 2019 年发布的。
基本用法
public static void main(String[] args){
Student student = new Student();
student.setName("张三");
student.setAge(26);
student.setScore(89.5);
Genson genson = new Genson();
String jsonStr = genson.serialize(student);
Student result = JsonIo.deserialize(jsonStr,Student.class);
}
使用起来非常方便。
JSON-P
JSON-P 是一个用于解析、构建、转换和查询 JSON 消息的 Java API。 Java Specification Request (JSR) 353提出了该API。 JSR 353 旨在开发一个 Java API 来处理 JSON。不过,大多数流行的库,如 Jackson、Gson 等,并不直接实现该规范。
添加依赖
<dependency>
<groupId>jakarta.json</groupId>
<artifactId>jakarta.json-api</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>jakarta.json</artifactId>
<version>2.0.1</version>
<classifier>module<classifier>
</dependency>
基本用法
public static void main(String[] args){
Student student = new Student();
student.setName("张三");
student.setAge(26);
student.setScore(89.5);
JsonObject json = Json.createObjectBuilder()
.add("age", foo.getAge())
.add("name", student.getName())
.build();
String result = json.toString();
JsonParser parser = Json.createParser(new StringReader(result));
while (parser.hasNext()) {
Event event = parser.next();
switch (event) {
case VALUE_STRING:
String value = parser.getString();
assertEquals(foo.getName(), value);
break;
}
}
parser.close();
}
- Json.createObjectBuilder()用于将对象转换为 JSON。
- Json.createParser()用于解析 JSON 。
- JSON-P API 最初设计是为了其他三方库在此基础上扩展实现的,直接使用会复杂些。
总结
org.json
- 特点:提供了JSONObject和JSONArray等类来表示JSON对象和数组。
- 用法:类似于Java的Map和List,用于创建和操作JSON数据。
Jackson
- 特点:高性能、功能丰富的JSON处理器。
- 用法:提供了注解和类型转换器来映射Java对象和JSON数据。
FastJson
- 特点:阿里巴巴开源的快速、高效的JSON处理库。
- 用法:简单易用,通过JSON.toJSONString和JSON.parseObject进行序列化和反序列化。
Gson
- 特点:Google开发的简单易用的JSON库。
- 用法:自动将Java对象转换为JSON字符串,或将JSON字符串转换为Java对象。
json-io
- 特点:无其他外部依赖的轻量级JSON处理库。
- 用法:提供了JsonIo.toJson和JsonIo.toObjects方法进行序列化和反序列化。
Genson
- 特点:功能强大的JSON解析库,但更新不频繁。
- 用法:提供了灵活的配置和扩展性。
JSON-P
- 特点:Java官方提供的JSON处理API,由JSR 353定义。
- 用法:使用JsonObject和JsonArray等类来操作JSON数据。
在Java中处理JSON数据时,开发者可以根据项目需求和个人偏好选择合适的库。org.json提供了基本的JSON操作功能,适合简单的需求。Jackson和FastJson因其高性能和易用性而广受欢迎。Gson以其简单性和Google的支持而受到开发者的喜爱。json-io和Genson提供了轻量级和高度可配置的解决方案。JSON-P作为官方API,虽然功能强大,但可能不如其他库那样流行和易于上手。开发者应根据项目的具体需求,如性能、易用性、社区支持和库的维护情况,来选择最合适的JSON处理库。