【问题标题】:Jackson with Hibernate for serializing to avoid enumsJackson 使用 Hibernate 进行序列化以避免枚举
【发布时间】:2015-10-06 07:12:42
【问题描述】:

我有一个实体订单,它与 OrderType 实体具有多对一的关系。

Order{
   OrderType type;
}

OrderType{
   int id;
   String tag; //This field is uniq
}

两者都是休眠实体。当我序列化(使用杰克逊)时,我将类型作为对象按顺序获取

"type" : {
   "id":1,
   "tag" : "TEST"
}

但我更愿意将我的类型显示为

"type" : "TEST"

类似地,在反序列化时,我需要创建 OrderType 对象,即使类型值将是与其等效的字符串。

"type" : "TEST" 应该构造

{
   "id":1,
   "tag" : "TEST"
}

并且必须是由唯一字段标记映射的休眠对象,并且如果字符串不存在需要抛出异常。

有人可以建议我实现它的最佳方法吗?

【问题讨论】:

    标签: java hibernate jackson


    【解决方案1】:

    根据Jackson docs,您可以尝试使用注释来获取不同的json字段并忽略等。类似的问题和答案是here就像这种情况。

    Order{
       @JsonUnwrapped
       OrderType type;
    }
    
    OrderType{
       @JsonIgnore
       int id;
       @JsonProperty("type")
       String tag;
    }
    

    当你序列化 Order 实体时它应该产生{"type":"typeValue"}

    【讨论】:

    • 但是当我反序列化它时它会从数据库中复制 id 值
    • @Ysak 可能不是,stackoverflow.com/questions/12505141/… 有类似的方法,但不是在枚举上,可能你可以将它包装在另一个类中,然后只给 JsonIgnore 注释获取器。
    【解决方案2】:

    看看 Jackson Custom Serializers 和 Deserializers。它们是用于创建自定义序列化和反序列化对象图的 Jackson 2 功能。参见herehere这两篇文章

    【讨论】:

      【解决方案3】:

      序列化:只需将@JsonValue 注释添加到OrderType.tag 字段(或getter 方法)。

      反序列化:可以添加静态@JsonCreator-annotated 方法:

      public class OrderType {
         @JsonCreator public static OrderType fromJson(String tagText) {
         }
      }
      

      如果你可以在这个静态方法中轻松获取当前线程相关的Hibernate session,那么你可以简单的填写实现来查询订单类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-07
        • 2015-10-19
        • 2020-07-17
        • 2022-01-01
        • 2012-03-07
        • 1970-01-01
        相关资源
        最近更新 更多