跳到主要内容

Fory v1.7.5 发布

· 阅读需 4 分钟
杨朝坤
Apache Fory PMC Member

Apache Fory 1.7.5 已发布。本次发布包含 4 位贡献者提交的 15 个 PR, 为 JSON 输出提供更多控制选项,完善 Scala 和 Kotlin JSON 处理,并扩展 Python 集合支持。 安装方式请参阅快速开始。

主要更新​

  • JSON 输出支持按次调用选择格式化输出、非 ASCII 转义、包含 Base16 的可配置字节数组格式,以及显式启用的默认值省略。
  • Scala 和 Kotlin JSON 改进编解码器覆盖范围与字段缺失时的默认值处理,并修复 Java JSON 访问器的 GraalVM 兼容问题。
  • Python 新增集合子类支持,并修复具名元组和时间类型数组缓冲区的处理。

JSON 输出选项​

Fory JSON 是 Java JSON 序列化框架,并提供可选的 Kotlin 和 Scala 模块。 应用现在可以复用同一个实例,按次调用选择格式化输出:

import java.util.Collections;
import org.apache.fory.json.ForyJson;

ForyJson json = ForyJson.builder().build();
String pretty = json.toPrettyJson(Collections.singletonMap("name", "Fory"));
byte[] prettyBytes = json.toPrettyJsonBytes(Collections.singletonMap("name", "Fory"));
String compact = json.toJson(Collections.singletonMap("name", "Fory"));

escapeNonAscii(true) 将非 ASCII 字符串值和名称写为 JSON Unicode 转义。 builder 的 byteArrayFormat 为普通字节数组选择 Base64 字符串、Base16 字符串或有符号数字数组格式, 并适用于嵌套值。属性级 JsonByteArray 注解可以覆盖该默认设置:

import org.apache.fory.json.ForyJson;
import org.apache.fory.json.annotation.JsonByteArray;

ForyJson hexJson = ForyJson.builder()
.byteArrayFormat(JsonByteArray.Format.BASE16)
.build();
String text = hexJson.toJson(new byte[] {1, -2, 3}); // "\"01fe03\""
byte[] bytes = hexJson.fromJson(text, byte[].class);

通过属性上的 JsonProperty 或类上的 JsonInclude 显式启用 NON_DEFAULT,即可省略默认值。 应用只能为稳定、可安全求值且字段缺失时能恢复一致值的默认值启用该策略。 全局 NON_DEFAULT 会被拒绝。Scala 的 NON_EMPTY 也能识别 None 以及受支持的空严格求值集合和 Map。

输出选项见 JSON 对象映射, 支持的模型和配置示例见默认值省略。

Scala 和 Kotlin JSON 支持​

Scala 扩展了泛型 case class、Unit、枚举类型令牌的支持,并可为由单例分支组成的 sealed 类型层次 显式选择字符串编解码器。Scala 和 Kotlin 也完善了字段缺失时的默认值处理:Scala 使用声明的构造函数 默认值或类型默认值;Kotlin 优先使用声明的默认值,否则非空数值和 Boolean 参数使用零或 false, 可空参数使用 null。其他非空 Kotlin 参数仍为必需参数。

精确的类型和 null 行为见 Scala 和 Kotlin 指南。本次发布还修复了 GraalVM Native Image 中 Java JSON 访问器的处理。

Python 集合与缓冲区​

Xlang 模式接受 Mapping、Sequence 和 Set 的实现及其可变变体, 并将其值恢复为内置 dict、list 和 set 对象。Python 原生模式会保留已注册的 list、dict 和 set 子类及其实例状态。

原生模式还修复了具名元组重建,并支持 NumPy 日期时间、时间差数组,以及 Pandas 日期时间列和索引的 带外缓冲区。示例见 Python 集合接口、 原生模式和 带外序列化。

完整发布说明见 GitHub。

完整变更记录:v1.7.4...v1.7.5