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

ION转换为JSON时丢失类型注解,如何将注解转为JSON字段保留?

ION转JSON保留类型注解解决方案

问题原因

JSON本身没有对应ION类型注解的原生语法,你当前使用的JSON模式IonWriter默认会直接丢弃所有ION类型注解信息,因此序列化后结构体的注解信息全部丢失。

实现思路

在执行JSON序列化前,先递归遍历整个ION数据树,将每个值携带的类型注解主动写入为对应结构体的自定义字段,再执行序列化操作。该方案完全兼容存量ION数据,不需要修改数据源侧的序列化逻辑。

完整实现代码

import com.amazon.ion.*;
import com.amazon.ion.system.IonSystemBuilder;
import com.amazon.ion.system.IonTextWriterBuilder;

public class IonToJsonConverter {
    private final IonSystem system = IonSystemBuilder.standard().build();

    public String convert(final String serializedIon) {
        final IonValue ionValue = system.singleValue(serializedIon);
        // 预处理:将类型注解写入为结构体字段
        processIonValue(ionValue);
        
        final StringBuilder stringBuilder = new StringBuilder();
        try (final IonWriter writer = IonTextWriterBuilder.json().build(stringBuilder)) {
            ionValue.writeTo(writer);
        }
        return stringBuilder.toString();
    }

    private void processIonValue(IonValue value) {
        if (value == null || value.isNullValue()) {
            return;
        }
        // 处理当前值的类型注解
        final String[] annotations = value.getTypeAnnotations();
        if (annotations.length > 0 && value instanceof IonStruct struct) {
            // 取第一个注解作为type字段值,多注解场景可自行调整为拼接或数组存储
            struct.put("type").newString(annotations[0]);
        }
        // 递归处理容器内的所有子元素
        if (value instanceof IonContainer container) {
            container.forEach(this::processIonValue);
        }
    }
}

注意事项

  • 如果原有结构体中已经存在type字段,可修改代码中的字段名为ion_annotation等自定义名称,避免覆盖原有业务数据
  • 若需要支持非结构体类型(字符串、数字等)的注解保留,可以扩展逻辑,将带注解的基础类型封装为{"type": "注解值", "value": 实际值}的结构体
  • 单个值携带多个注解的场景,可自行调整注解的读取和存储逻辑

内容的提问来源于stack exchange,提问作者Harshit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:48:04