Jsoniter(java版本)使用介绍

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 | 极限性能 |

相关推荐
寻寻觅觅☆5 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
l1t5 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
青云计划5 小时前
知光项目知文发布模块
java·后端·spring·mybatis
ceclar1236 小时前
C++使用format
开发语言·c++·算法
探路者继续奋斗6 小时前
IDD意图驱动开发之意图规格说明书
java·规格说明书·开发规范·意图驱动开发·idd
码说AI6 小时前
python快速绘制走势图对比曲线
开发语言·python
Gofarlic_OMS7 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
星空下的月光影子7 小时前
易语言开发从入门到精通:补充篇·网络爬虫与自动化采集分析系统深度实战·HTTP/HTTPS请求·HTML/JSON解析·反爬策略·电商价格监控·新闻资讯采集
开发语言
老约家的可汗7 小时前
初识C++
开发语言·c++