JsonTypeInfo.As.EXISTING_PROPERTY:
当使用 EXISTING_PROPERTY 时,类型信息被包含在一个已有的属性中,而不是创建一个新的属性来存储类型信息。
在 JSON 对象中,已有的属性将用于存储类型信息。例如,如果您的数据结构已经包含了一个属性,您可以使用这个属性来存储类型信息。
在反序列化时,Jackson 会查找已有的属性并将其用作类型信息。
JsonTypeInfo.As.EXTERNAL_PROPERTY:
当使用 EXTERNAL_PROPERTY 时,类型信息被包含在一个新的外部属性中。
在 JSON 对象中,新的外部属性将用于存储类型信息。这个外部属性与您的数据结构中的其他属性是分离的。
在反序列化时,Jackson 会查找这个外部属性并将其用作类型信息。
总的来说,这两个选项的区别在于类型信息是放在已有的属性中(EXISTING_PROPERTY)还是放在一个新的外部属性中(EXTERNAL_PROPERTY)。
用法和场景
使用 EXISTING_PROPERTY
的主要情况是,在已有的 JSON 数据结构中,你想要将类型信息嵌入到某个现有的属性中,而不是在顶层或额外的属性中传递类型信息。这可以帮助你在不破坏现有 JSON 结构的情况下,添加多态类型的支持。
举例来说,如果你有一个 shape
属性,可以使用 EXISTING_PROPERTY
来将多态类型信息嵌入到 shape
属性中。
用法和场景
使用 EXTERNAL_PROPERTY
的场景是,你希望将类型信息作为额外的属性传递,而不是嵌套在对象的属性中。这可能在你的 JSON 数据结构中没有现成的属性来包含类型信息时特别有用。
举例来说,你可以在 JSON 数据中添加一个名为 "@type"
的属性,用于传递类型信息,而不影响对象的其他属性。
JsonTypeInfo.As.EXISTING_PROPERTY
{
"name": "string",
"identifier": "string",
"required": boolean,
"rwFlag": "", // RO/RW
"dataSpecs": DataSpec
}
"dataSpecs": {
"dataType": "", // NUMERIC/TEXT/ENUM
"defaultValue": number,
"max": number,
"min": number,
"step": number,
"unit": "min",
"unitName": "分钟"
}
JsonTypeInfo.As.EXTERNAL_PROPERTY
{
"name": "string",
"identifier": "string",
"required": boolean,
"rwFlag": "", // RO/RW
"dataType": "", // NUMERIC/TEXT/ENUM
"dataSpecs": DataSpec
}
"dataSpecs": {
"defaultValue": number,
"max": number,
"min": number,
"step": number,
"unit": "min",
"unitName": "分钟"
}
"dataSpecs": {
"defaultValue": "",
"length": 1024
}
"dataSpecs": {
"defaultValue": 1,
"enum": [
{
"name": "关闭",
"value": 0
},
{
"name": "打开",
"value": 1
}
]
}
各个Json作用:
使用 Jackson 库中的注解来处理 JSON 序列化和反序列化的相关设置。各个注解的作用:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "type", visible = true)
@JsonTypeInfo: 这是一个 Jackson 注解,用于指定在序列化和反序列化时如何处理类型信息。
use = JsonTypeInfo.Id.NAME: 表示使用名称作为类型信息的标识。
include =JsonTypeInfo.As.EXISTING_PROPERTY: 表示类型信息应该作为现有属性的一部分存在。
property = "type": 指定用于存储类型信息的属性名,这里是 "type"。
visible = true: 表示类型信息应该在 JSON 中可见。
@JsonSubTypes({@JsonSubTypes.Type(value = StartEvent.class, name = "startEvent"), @JsonSubTypes.Type(value = EndEvent.class, name = "endEvent")})
@JsonSubTypes: 这个注解用于指定不同子类型的映射关系。
@JsonSubTypes.Type(value = StartEvent.class, name = "startEvent"): 表示将 StartEvent 类映射到 JSON 中的类型名称 "startEvent"。
@JsonSubTypes.Type(value = EndEvent.class, name = "endEvent"): 表示将 EndEvent 类映射到 JSON 中的类型名称 "endEvent"。
总体来说,这些注解帮助在处理 JSON 时,正确地序列化和反序列化 BaseElement 类的子类型(如 StartEvent 和 EndEvent),并在 JSON 数据中包含类型信息,以便能够正确地还原对象的类型结构。
因篇幅问题不能全部显示,请点此查看更多更全内容