gpt4 book ai didi

json - jackson :JsonTypeInfo 不添加属性

转载 作者:行者123 更新时间:2023-12-01 09:00:47 31 4
gpt4 key购买 nike

我正在尝试使用 Jackson 来序列化具有多态性的实体。序列化的 JSON 字符串应该包含一个附加的“type”属性,其中“groupA”或“groupB”作为值,但它没有。我的实体如下所示:

@Entity
@Table(name = "\"group\"")
@Inheritance(strategy = InheritanceType.JOINED)
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = GroupA.class, name = "groupA"),
@JsonSubTypes.Type(value = GroupB.class, name = "groupB")
})
@JsonSerialize(include = JsonSerialize.Inclusion.ALWAYS)
public class Group implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

// ...
}



@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSerialize(include = JsonSerialize.Inclusion.ALWAYS)
public class GroupA extends Group {
//...
}



@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSerialize(include = JsonSerialize.Inclusion.ALWAYS)
public class GroupB extends Group {
// ...
}

你知道为什么序列化器不添加类型属性吗?

最佳答案

问题是 Controller Action :

@RequestMapping(...)
@ResponseBody
public Map<String, Object> getGroups() {
Map<String, Object> response = new HashMap<String, Object>();
List<Group> groups = magicallyRetrieveGroupsFromNarnia();
response.put("groups", groups);
response.put("status", Status.OK);
return response;
}

它返回一个字符串对象元组的映射。 MappingJackson2HttpMessageConverter 将此映射扔到 ObjectMapper 中。 ObjectMapper 不关心提供的 map 内容的@JsonTypeInfo,因为它不知道它。它所看到的只是穿着不舒服的对象套装的类型删除的 List 实例。

有多种方法可以解决这个问题:

  • 使用 map >。
    • 缺点:不能混合类型(整数、字符串、复杂对象、列表等)。
    • 优点:很简单。
  • 创建一个显式的 GroupList。
    • 缺点:杂乱无章。
    • 优势:适用于 map 。
  • 创建具有显式字段的复杂对象。
    • 缺点:杂乱无章。
    • 优势:适用于 map 。
  • 在自定义 MappingJackson2HttpMessageConverter 扩展中使用类型化编写器。
    • 缺点:比较复杂。
    • 优势:非常灵活。

这个 JIRA 问题帮助我理解了问题: https://github.com/FasterXML/jackson-databind/issues/364

关于json - jackson :JsonTypeInfo 不添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17488060/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com