Jsoniter (json-iterator) 是一款高性能、轻量级且极具灵活性的 Java JSON 解析与序列化库,号称比普通 JSON 解析器快 10 倍以上。它支持多种 API 风格(Bind, Any, Iterator),并兼容 Jackson 的注解,特别适合需要极致性能和低内存占用的高并发场景。
核心特点:
- 极致性能:通过独特的 iterator API 实现了极致的解析速度,减少不必要的内存复制和反射使用。主打"零拷贝 + 高速反射"
- 三种操作模式:
- Bind API:类似 Jackson/Gson,直接将 JSON 映射到 Java 对象。
- Any API:类似 JsonNode,提供灵活的动态访问方式。
- Iterator API:独特的迭代器模式,实现 0 内存分配的直接遍历。
- 高度兼容:兼容 Jackson 注解,方便从 Jackson 迁移。
- 极致动态/静态生成:使用 tri-tree 方式提高性能,支持动态代码生成,同时也支持在 Android 等受限平台使用静态代码生成。
github:https://github.com/json-iterator/java
1、三种模式使用
maven
<dependency>
<groupId>com.jsoniter</groupId>
<artifactId>jsoniter</artifactId>
<version>0.9.23</version>
</dependency>
1.1)序列化/反序列化(Bind API)
java
import com.jsoniter.JsonIterator;
import com.jsoniter.output.JsonStream;
static void bindTest() {
String jsonStr = "{\"name\":\"test\",\"age\":1}";
//序列化
User user = JsonIterator.deserialize(jsonStr, User.class);
System.out.println(user); //Test2.User(name=test, age=1)
//反序列化
String json = JsonStream.serialize(user);
System.out.println(json); //{"name":"test","age":1}
}
@Data
public static class User {
public String name;
public Integer age; // 允许 null;如果是int age,则默认为0
}
说明:如果json字符串中没有传age字段,那么在User类中:如果age是int类型,值会默认为0;如果age是Integer类型,值为null。
此外,反序列化时:当json字符串中的字段大于类中定义的字段时,不会报错!这一点和JackJson不一样,JackJson会报错:Unrecognized field "xxx"
java
String jsonStr = "{\"name\":\"test\",\"age\":1,\"address\":\"Beijing\"}";
User user = JsonIterator.deserialize(jsonStr, User.class);
System.out.println(user); //Test2.User(name=test, age=1)
User user1 = new ObjectMapper().readValue(jsonStr, User.class); //报错:Unrecognized field "address" (class Test2$User)
1.2)Any API:
允许以极高的性能动态解析和访问复杂的、非结构化或部分结构的 JSON 数据,无需显式创建 Java POJO 类。通过 Jsoniter.deserialize(json) 获取 Any 对象后,可使用 get(key)、get(data, path...)、toString()、toInt() 等方法深层级查找、遍历和类型转换,具有极致的性能与灵活性,极大地减少了内存分配和反射使用。
适用于不确定 JSON 结构或只需读取大 JSON 中部分字段的场景,具备类似 PHP 数组的便利性。
java
import com.jsoniter.JsonIterator;
import com.jsoniter.any.Any;
public class JsoniterAnyDemo {
public static void main(String[] args) {
String json = "{\"name\":\"John\", \"age\":30, \"roles\":[\"admin\", \"user\"], \"address\":{\"city\":\"Beijing\"}}";
// 1. 将JSON解析为Any对象
Any obj = JsonIterator.deserialize(json);
// 2. 基本访问
String name = obj.get("name").toString();
int age = obj.get("age").toInt();
System.out.println(name + " is " + age); // 输出: John is 30
// 3. 深层访问 (Nested Access)
String city = obj.get("address", "city").toString();
System.out.println("City: " + city); // 输出: City: Beijing
// 4. 访问数组
String firstRole = obj.get("roles", 0).toString();
System.out.println("First role: " + firstRole); // 输出: First role: admin
// 5. 遍历数组
for (Any role : obj.get("roles")) {
System.out.println("Role: " + role.toString());
}
}
}
1.3)Iterator API:
Jsoniter 的 Iterator API 专为高性能、低内存占用设计,适合处理超大 JSON 输入。核心在于使用 Jsoniter.parse(String/byte[]/InputStream) 读取数据,并通过 readArray()、readObject() 或 readString() 等方法高效地选择性读取数据,无需全量解析。
java
String json = "{"
+ "\"id\":1001,"
+ "\"scores\":[90,85],"
+ "\"meta\":{\"city\":\"BJ\",\"level\":2}"
+ "}";
JsonIterator iter = JsonIterator.parse(json);
String field;
while ((field = iter.readObject()) != null) {
switch (field) {
case "id":
System.out.println(iter.readInt());
break;
case "scores":
while (iter.readArray()) {
System.out.println(iter.readInt());
}
break;
case "meta":
String mf;
while ((mf = iter.readObject()) != null) {
if ("city".equals(mf)) {
System.out.println(iter.readString());
} else {
iter.skip();
}
}
break;
default:
iter.skip();
}
}
Jsoniter Iterator ≠ JsonNode。它是一个 JSON 流状态机,你要时刻知道:
• 当前在 对象 / 数组
• 下一个 token 是 key 还是 value
• 你要不要这个字段
总结:三种模式横向对比
|--------------|-------|-------|-------|----|---------|
| 模式 | 易用性 | 灵活性 | 性能 | GC | 典型用途 |
| Bind API | ⭐⭐⭐⭐ | ⭐ | ⭐⭐ | 有 | 固定结构 |
| Any API | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 少 | 配置 / 规则 |
| Iterator API | ⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 0 | 极限性能 |