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

类级别Json注解能否将JSON值映射到单字段自定义类的内部属性?

解决方案

存在类级别的注解可以实现该映射需求,根据你使用的JSON库不同,常用实现方式如下:

方案1:使用Jackson库(Spring生态默认JSON库)

有两种类级别的实现方式,均无需修改Person类的字段配置:

  1. 组合@JsonCreator + @JsonValue注解
    该方案无需额外编写转换器,仅需调整自定义封装类的构造方法即可:
    // Name类实现
    public class Name {
        // 序列化时直接输出value字段的值
        @JsonValue
        public String value;
    
        // 反序列化时直接将JSON中的字符串作为构造参数传入
        @JsonCreator
        public Name(String value) {
            this.value = value;
        }
    }
    
    // Phone类实现
    public class Phone {
        @JsonValue
        public String brand;
    
        @JsonCreator
        public Phone(String brand) {
            this.brand = brand;
        }
    }
    
  2. 类级别绑定转换器
    如果你完全不能修改原有类的结构(不能新增构造方法),可以使用@JsonDeserialize注解绑定自定义转换器,属于纯类级别配置:
    // 给Phone类加类级别注解
    @JsonDeserialize(converter = StringToPhoneConverter.class)
    public class Phone {
        public String brand;
    }
    
    // 转换器实现
    public class StringToPhoneConverter extends StdConverter<String, Phone> {
        @Override
        public Phone convert(String value) {
            Phone phone = new Phone();
            phone.brand = value;
            return phone;
        }
    }
    

方案2:使用Gson库

可以通过类级别@JsonAdapter注解绑定TypeAdapter实现全局映射,无需修改上层类的配置:

// 给Name类加类级别注解
@JsonAdapter(NameTypeAdapter.class)
public class Name {
    public String value;
}

// 自定义TypeAdapter实现
public class NameTypeAdapter extends TypeAdapter<Name> {
    @Override
    public void write(JsonWriter out, Name value) throws IOException {
        out.value(value.value);
    }

    @Override
    public Name read(JsonReader in) throws IOException {
        Name name = new Name();
        name.value = in.nextString();
        return name;
    }
}

以上所有方案均为类级别生效,只要给对应的封装类加上注解后,任何地方引用该类都会自动实现字符串值到内部属性的映射,符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:24:03