有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带Hibernate的java Jackson用于序列化以避免枚举

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

Order{
   OrderType type;
}

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

两者都是休眠实体。当我序列化(使用jackson)时,我得到的类型是一个对象,顺序如下

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

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

"type" : "TEST"

类似地,在反序列化时,我需要创建OrderType对象,即使类型值是它的字符串等价物

"type" : "TEST"应该构造

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

它必须是由唯一字段标记映射的hibernate对象,如果字符串不存在,则需要抛出异常

有人能给我建议实现这一目标的最佳方法吗


共 (3) 个答案

  1. # 1 楼答案

    看看Jackson自定义序列化程序和反序列化程序。它们是用于创建自定义序列化和反序列化对象图的Jackson 2功能。见第here条和第here

  2. # 2 楼答案

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

    反序列化:可以添加静态@JsonCreator注释的方法:

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

    如果您可以在这个静态方法中轻松地获得与当前线程相关的Hibernate会话,那么您只需填写实现以查询订单类型

  3. # 3 楼答案

    根据Jackson docs,您可以尝试使用注释来获取不同的json字段,并忽略其他内容。同样,类似的问题和答案与here类似

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

    当您序列化订单实体时,它应该生成{"type":"typeValue"}