Skip to content
Shaojin Wen edited this page Feb 15, 2024 · 17 revisions

Q1. 如何获得fastjson2

<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.46</version>
</dependency>

Q2. fastjson2支持的JDK版本有哪些?

fastjson2最低支持JDK 8,同时支持JDK 16引入的Record,不需要配置任何启动参数运行在JDK 17/21上。

每次构建都会验证在JDK 8/11/17/21三个JDK LTS版本上验证,保证兼容。在 https://github.com/alibaba/fastjson2/blob/main/.github/workflows/ci.yaml 中可以看到每次fastjson2发布构建验证的JDK版本列表。

Q3. fastjson2支持Android么?

fastjson2有针对android优化过的版本,分别是android5和android8版本,其中android8版本支持java.time和Optional,其余功能一样。android版本和标准版本的区别是,去掉一些android上不常用的能力,优化首次执行时间,还有就是针对android运行环境优化性能。fastjson2在2.0.46.android之后的版本,在Android环境性能提升明显。

<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.xx.android5</version>
</dependency>
<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.xx.android8</version>
</dependency>

Q4. fastjson2支持输入和输入为byte[]么?

支持,fastjson2序列化支持输出为char[]和byte[]。不需要将byte[]转成String再做parse,可以提升性能。使用如下:

  • 从utf8编码的byte[]反序列化
byte[] utf8 = ...;
Bean bean = JSON.parseObject(utf8, Bean.class);
  • 从指定编码的byte[]反序列化
byte[] bytes = ...;
Charset charset = ...;

Bean bean = JSON.parseObject(bytes, 0, bytes.length, charset, Bean.class);
  • 序列化为utf8 bytes
Bean bean = ...;
byte[] utf8 = JSON.toBytes(bean);

Q5. fastjson2是否兼容Jackson的Annotation?

fastjson2为了方便Jackson用户迁移,提供了对Jackson常用的Annotation的支持。

Q6. 如何自定义日期格式

fastjson2反序列化时会自动识别大多数日期格式,同时也支持自定义日期格式。

  • 序列化时支持自定义格式
LocalDateTime ldt = LocalDateTime.of(2012, 1, 2, 12, 13, 14);

assertEquals("\"2012-01-02\"", JSON.toJSONString(ldt, "yyyy-MM-dd"));
assertEquals("\"12-13-14\"", JSON.toJSONString(ldt, "HH-mm-ss"));

assertEquals("1325477594000", JSON.toJSONString(ldt, "millis"));
assertEquals("1325477594", JSON.toJSONString(ldt, "unixtime"));
  • 使用JSONField Annotation自定义字段的序列化格式
public static class Bean {
    @JSONField(format = "yyyy-MM-dd")
    public Date date;
}

Q7. 如何解决返回较大整数javascript丢失精度问题

当返回的整数大于9007199254740991或者小于-9007199254740991时,在javascript中会丢失精度。此时使用JSONWriter.Feature.BrowserCompatible能自动将数值变成字符串返回,解决精度问题。

assertEquals(
        "9007199254740992",
        JSON.toJSONString(9007199254740992L));

assertEquals(
        "\"9007199254740992\"",
        JSON.toJSONString(9007199254740992L, JSONWriter.Feature.BrowserCompatible));

Q8. 如何解决返回JSON数据中带XSS攻击脚本的问题

使用JSONWriter.Feature.BrowserSecure能自动将存在XSS攻击风险的文本做转义,如下:

assertEquals("\"<script>alert('XSS');</script>\"",
        JSON.toJSONString("<script>alert('XSS');</script>"));

assertEquals("\"\\u003cscript\\u003ealert\\u0028'XSS'\\u0029;\\u003c/script\\u003e\"",
        JSON.toJSONString("<script>alert('XSS');</script>", JSONWriter.Feature.BrowserSecure));

Q9. 如何做全局配置

可以通过JSON.config方法配置序列化和反序列化Feature,比如:

JSON.config(JSONWriter.Feature.WriteNulls);

JSON.config(JSONReader.Feature.IgnoreNullPropertyValue);