使用 Jackson Annotation 将 json 数据映射到 Spring Data JPA 中的预期值

Posted

技术标签:

【中文标题】使用 Jackson Annotation 将 json 数据映射到 Spring Data JPA 中的预期值【英文标题】:Map json data to expected values in Spring Data JPA with Jackson Annotation 【发布时间】:2017-03-22 21:17:17 【问题描述】:

我有如下 json 数据:


  "data":[
    "val":"1",
    "val":"2",
    "val":"3"
  ]

但我期待这样的事情


  "data":[
    "val":"Red",
    "val":"Green",
    "val":"Blue"
  ]



@Column(name = "colorname")
@JsonProperty("val")
String colorName;

在转换为 Pojos 时,是否有任何 Jackson 注释将这些数字映射到 colorNames?或者有什么更好的方法来获得预期的结果?

【问题讨论】:

为此,您需要定义您的自定义序列化程序。请看***.com/questions/34297506/… 使用自定义反序列化器或自定义 setColorName() 方法 【参考方案1】:

你可以像下一个一样创建一个序数枚举:

public enum Color 
    Green, 
    Blue,
    Red
    //and so on

然后你需要一个自定义的反序列化器,你只需要执行类似下一个的操作(指定field name 为键,writeString 为颜色值):

public class ColorSerializer extends StdSerializer<Color> 

    public ColorSerializer() 
        this(null);
    

    public ColorSerializer(Class<Color> t) 
        super(t);
    

    public void serialize(Color value, JsonGenerator gen, SerializerProvider provider) 
      throws IOException, JsonProcessingException 
        gen.writeStartObject();
        gen.writeFieldName("val");
        gen.writeString(value.toString());
        gen.writeEndObject();
    
 

您必须使用注解@JsonSerialize 指定在您的枚举中使用此序列化程序,颜色枚举为下一个:

@JsonSerialize(using = ColorSerializer.class)
public enum Color 
     //....

最后,您必须将 typecolorName 属性更改为 Color 枚举类型而不是 String 并注释为 Enumarted Ordinal 类型 (JPA)

@Enumerated(EnumType.ORDINAL)
Color color;

【讨论】:

感谢 Pau 的评论。我需要一个反序列化器来从 JSON 中获取值。但现在已经解决了。

以上是关于使用 Jackson Annotation 将 json 数据映射到 Spring Data JPA 中的预期值的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.ClassNotFoundException: com.fasterxml.jackson.annotation.JsonInclude$Value

高复用服务响应对象

使用 Jackson 将 Map 转换为 JSON

Java 自定义响应数据结构

练习:将值是null的数据删除掉(剔除):com.fasterxml.jackson.annotation.JsonInclude;包

接口时间处理