Jackson控制多态的注解--JsonTypeInfo,JsonSubTypes,JsonTypeName

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 数据中包含类型信息,以便能够正确地还原对象的类型结构。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值