类级别Json注解能否将JSON值映射到单字段自定义类的内部属性?
解决方案
存在类级别的注解可以实现该映射需求,根据你使用的JSON库不同,常用实现方式如下:
方案1:使用Jackson库(Spring生态默认JSON库)
有两种类级别的实现方式,均无需修改Person类的字段配置:
- 组合
@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; } } - 类级别绑定转换器
如果你完全不能修改原有类的结构(不能新增构造方法),可以使用@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
相关产品推荐
相关产品推荐

