【发布时间】:2020-08-17 17:33:33
【问题描述】:
我有一个带有动态 attribute 孩子的 json,如下所示:
{
"label":"Some label",
"attribute": { <--- Dynamic attribute object
"type": "TEXT", <--- Field used to map `attribute` dynamic (inside child object)
"languages":[
{
"language":"en_EN",
"text":"do you approve?"
}
]
}
}
或者
{
"label":"Some label",
"attribute": {
"type": "NUMBER",
"value: "10.0"
}
}
我可以使用@JsonSubTypes 正确反序列化上面的 json 代码:
@Data
public class Field {
private String label;
private Attribute attribute;
}
@Data
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Attribute.NumberAttribute.class, name = "NUMBER"),
@JsonSubTypes.Type(value = Attribute.TextAttribute.class, name = "TEXT")
})
public class Attribute {
private AttributeType type;
@Data
public static class TextAttribute extends Attribute {
List<Language> languages;
}
@Data
public static class NumberAttribute extends Attribute {
String value;
}
@Data
public static class Language {
private String text;
private String language;
}
}
但是,我遇到的问题是我必须使用属性对象内部的type 字段,并且我需要将类型移动到父对象。结尾的json应该是这样的:
{
"type": "TEXT", <--- Field used to map `attribute` dynamic (in parent object)
"label":"Some label",
"attribute": { <--- Dynamic attribute object
"languages":[
{
"language":"en_EN",
"text":"do you approve?"
}
]
}
}
或者
{
"type": "NUMBER",
"label":"Some label",
"attribute": {
"value: "10.0"
}
}
我找不到任何方法来使用父字段(或 json 路径方式)来使用动态子类型之外的 type 属性。你知道我该怎么做吗?
【问题讨论】:
-
@MichałZiober 谢谢,不完全是我正在寻找的序列化方式,因为他们使用自定义序列化器和其他基于类类型的序列化器。根据输入类型,Ken 的答案是我想要的。
标签: java json spring-boot jackson