You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置JSON-B将数值序列化为字符串以适配JavaScript整数限制

解决RestEasy + JSON-B/Yasson大数值转字符串输出的方案

好问题!我刚好在项目里处理过完全相同的场景——要把Java里的大整数(比如Long、BigInteger)序列化为JSON字符串,避免JavaScript处理时的精度丢失,而且不想写自定义序列化器。用JSON-B/Yasson配合RestEasy确实有几种开箱即用的方案,给你详细说下:

方案一:全局配置所有数值转字符串(适合全量场景)

如果你的项目里所有超过JS 32位整数范围的数值都需要转字符串,可以直接全局配置JSON-B的序列化规则,不用修改任何业务代码:

方式1:通过CDI Producer自定义Jsonb实例

在项目里创建一个CDI Bean,生成带有全局配置的Jsonb实例,RestEasy会自动识别并使用它:

import javax.enterprise.context.ApplicationScoped;
import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;
import javax.json.bind.JsonbConfig;

@ApplicationScoped
public class CustomJsonbProducer {

    public Jsonb produceJsonb() {
        JsonbConfig config = new JsonbConfig()
                // 开启全局数值转字符串的配置
                .withNumberAsString(true);
        return JsonbBuilder.create(config);
    }
}

方式2:通过jsonb.properties配置文件

在项目的META-INF目录下创建jsonb.properties文件,添加以下配置:

jsonb.number.as.string=true

这个配置会被Yasson自动加载,全局生效。

方案二:字段级精准控制(仅指定大数值字段转字符串)

如果你只想把特定的大数值字段转字符串,其他普通整数保持数值类型,可以用Yasson提供的@JsonbNumberAsString注解,直接标注在字段或者对应的getter方法上:

public class ApiResponse {
    // 这个大ID字段会被序列化为字符串
    @JsonbNumberAsString
    private Long largeBusinessId;

    // 普通ID保持数值类型输出
    private Integer normalId;

    // 大整数类型同样适用
    @JsonbNumberAsString
    private BigInteger hugeNumber;

    // getter、setter方法省略
}

这个注解是Yasson原生支持的,属于JSON-B的扩展特性,完全不需要自己写序列化器。

注意事项

  • 确保你的RestEasy版本已经集成了Yasson(RestEasy 3.10+或者Jakarta EE环境下的RestEasy通常默认集成);
  • 如果用@JsonbNumberAsString,要注意Yasson版本至少是1.0.0以上,这个注解在早期版本可能不支持。

这样不管是全局统一处理还是精准控制单个字段,都能满足你的需求,而且完全不用编写自定义序列化器或者适配器~

内容的提问来源于stack exchange,提问作者Fábio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:37:19