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

如何通过Jackson动态反序列化嵌套在JSON中的JSON字符串?

解决Jackson嵌套JSON字符串反序列化为实体类的问题

完全可以通过实体类添加Jackson注解或者类库全局配置实现自动反序列化,两种方案如下:

一、实体类注解方案(针对单个字段)

如果只需要处理特定实体类的某个字段,自定义一个JSON反序列化器,然后用@JsonDeserialize注解绑定到目标字段上即可。

1. 自定义嵌套JSON反序列化器

public class NestedJsonDeserializer<T> extends JsonDeserializer<T> {
    private final ObjectMapper innerMapper = new ObjectMapper();
    private final Class<T> targetType;

    // 通过构造器传入目标类型
    public NestedJsonDeserializer(Class<T> targetType) {
        this.targetType = targetType;
    }

    @Override
    public T deserialize(JsonParser parser, DeserializationContext context) throws IOException {
        // 读取JSON中的字符串值
        String nestedJsonStr = parser.getText();
        // 将字符串反序列化为目标类型
        return innerMapper.readValue(nestedJsonStr, targetType);
    }

    // 为泛型提供Builder,方便注解中指定类型
    public static class Builder<T> {
        private final Class<T> targetType;
        public Builder(Class<T> targetType) {
            this.targetType = targetType;
        }
        public NestedJsonDeserializer<T> build() {
            return new NestedJsonDeserializer<>(targetType);
        }
    }
}

2. 在实体类字段上绑定注解

public class Something {
    private int abc;

    // 绑定自定义反序列化器,指定目标类型为Xyz
    @JsonDeserialize(using = NestedJsonDeserializer.class,
                     builder = new NestedJsonDeserializer.Builder<>(Xyz.class))
    private Xyz xyz;

    // 省略getter、setter、构造方法
}

二、类库全局配置方案(批量处理同类型字段)

如果多个实体类的Xyz类型字段都需要这种转换,可以在类库的ObjectMapper中全局注册自定义反序列化器,无需修改每个实体类。

// 初始化ObjectMapper时注册自定义模块
ObjectMapper objectMapper = new ObjectMapper();
SimpleModule customModule = new SimpleModule();

// 为Xyz类型注册反序列化器
customModule.addDeserializer(Xyz.class, new JsonDeserializer<Xyz>() {
    private final ObjectMapper innerMapper = new ObjectMapper();

    @Override
    public Xyz deserialize(JsonParser parser, DeserializationContext context) throws IOException {
        String nestedJsonStr = parser.getText();
        return innerMapper.readValue(nestedJsonStr, Xyz.class);
    }
});

objectMapper.registerModule(customModule);

额外注意事项

  • 如果嵌套JSON字符串可能存在格式错误,建议在反序列化器中添加异常处理(比如捕获JsonProcessingException并返回默认值或抛出业务异常)。
  • 如果同一字段可能同时出现正常JSON对象和嵌套JSON字符串两种格式,可以在反序列化器中先判断当前JSON token类型:
    @Override
    public Xyz deserialize(JsonParser parser, DeserializationContext context) throws IOException {
        if (parser.currentToken() == JsonToken.VALUE_STRING) {
            return innerMapper.readValue(parser.getText(), Xyz.class);
        } else {
            // 正常对象反序列化逻辑
            return parser.readValueAs(Xyz.class);
        }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:35:21