- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
项目开发中,一个实体类,可能存在公共的数据字段,也存在一个字段可能是多种类型的,比如:下图中的,详单数据中存在的计算,存储,流量的数据。
此时,就需要JsonTypeInfo,实现多态的处理,这样就会根据不同的值,进行复制,此例子中的是枚举值。
附注:
@JsonTypeInfo
作用于类/接口,被用来开启多态类型处理,对基类/接口和子类/实现类都有效
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.PROPERTY,property = “name”)
use:定义使用哪一种类型识别码,它有下面几个可选值:
JsonTypeInfo.Id.CLASS:使用完全限定类名做识别
JsonTypeInfo.Id.MINIMAL_CLASS:若基类和子类在同一包类,使用类名(忽略包名)作为识别码
JsonTypeInfo.Id.NAME:一个合乎逻辑的指定名称
JsonTypeInfo.Id.CUSTOM:自定义识别码,由@JsonTypeIdResolver对应,稍后解释
JsonTypeInfo.Id.NONE:不使用识别码
include(可选):指定识别码是如何被包含进去的,它有下面几个可选值:
JsonTypeInfo.As.PROPERTY:作为数据的兄弟属性
JsonTypeInfo.As.EXISTING_PROPERTY:作为POJO中已经存在的属性
JsonTypeInfo.As.EXTERNAL_PROPERTY:作为扩展属性
JsonTypeInfo.As.WRAPPER_OBJECT:作为一个包装的对象
JsonTypeInfo.As.WRAPPER_ARRAY:作为一个包装的数组
property(可选):制定识别码的属性名称
use为JsonTypeInfo.Id.CLASS(若不指定property则默认为@class)、JsonTypeInfo.Id.MINIMAL_CLASS(若不指定property则默认为@c)、JsonTypeInfo.Id.NAME(若不指定property默认为@type),
include为JsonTypeInfo.As.PROPERTY、JsonTypeInfo.As.EXISTING_PROPERTY、JsonTypeInfo.As.EXTERNAL_PROPERTY时才有效
defaultImpl(可选):如果类型识别码不存在或者无效,可以使用该属性来制定反序列化时使用的默认类型
visible(可选,默认为false):是否可见
属性定义了类型标识符的值是否会通过JSON流成为反序列化器的一部分,默认为fale,也就是说,jackson会从JSON内容中处理和删除类型标识符再传递给JsonDeserializer。
@JsonSubTypes
作用于类/接口,用来列出给定类的子类,只有当子类类型无法被检测到时才会使用它,一般是配合@JsonTypeInfo在基类上使用,比如:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.PROPERTY,property = “typeName”)
@JsonSubTypes({@JsonSubTypes.Type(value=Sub1.class,name = “sub1”),@JsonSubTypes.Type(value=Sub2.class,name = “sub2”)})
@JsonSubTypes的值是一个@JsonSubTypes.Type[]数组,里面枚举了多态类型(value对应子类)和类型的标识符值(name对应@JsonTypeInfo中的property标识名称的值,此为可选值,若不制定需由@JsonTypeName在子类上制定)
当尝试将通用对象序列化/反序列化为特定类时,我遇到了以下问题: 代码: // Generic holding the payload data linked to this event @JsonTy
我正在使用 Jersey 编写 REST 服务。我有一个带有注释的抽象类 Promotion: @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS) 因此,当我返回一个
所以我的 JSON 看起来像这样: { "ActivityDisplayModel" : { "name" : "lunch with friends", "s
我正在尝试使用 Jackson 2.9.8 序列化/反序列化多态类型,除非我将此类类型的对象放入集合中,否则它可以正常工作,因为由于某种原因,当时没有写入类型信息。让我们考虑以下示例: @JsonIg
使用 Spring 3 和 Jackson 1.7.6,我可以序列化抽象类的实现并将类的完全限定名称输出为名为 @class 的属性。 .当我的 Spring Controller 从用 @Respo
使用这些依赖 compile "com.fasterxml.jackson.core:jackson-annotations:2.8.8" compile "org.codehaus.jackson:
我正在使用以下依赖项进行 JSON 序列化/反序列化 com.fasterxml.jackson.core jackson-databind 2.7.4 com.
我正在尝试序列化和反序列化(使用 Json 和 ObjectMapper )在基类上具有以下注释的对象的多态列表: @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, i
我正在尝试使用 Jackson 来序列化具有多态性的实体。序列化的 JSON 字符串应该包含一个附加的“type”属性,其中“groupA”或“groupB”作为值,但它没有。我的实体如下所示: @E
friend 们, Jackson 框架提供基于注释的方法来在序列化过程中发出类型信息。 我不想使用 @JsonTypeInfo 我的任何类(class)中的注释。 以上注释是否有任何替代方案。 如果
我发现 Jackson JSON Processor 库有一些奇怪的行为,我很好奇这是故意的还是错误。请看下面的代码: @JsonTypeInfo(use = Id.NAME) public clas
我正在使用 @JsonTypeInfo 指示 Jackson 在 @class 属性中查找具体类型信息。但是,有时我不想指定 @class,特别是当可以根据上下文推断出子类型时。 最好的方法是什么?
我的父类(super class)型注释为 @JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "_typeid") - 以便
我有这样的回应: { "id":"decaa828741611e58bcffeff819cdc9f", "statement":"question statement", "
我有类层次结构 A <- B <- C。我不希望类 A 知道 C,所以我打算使用 A.type="B"表示它是类 B,然后是 B.type2 ="C"表示它是 C 类。 @JsonTypeInfo(u
我的目标是使用 Jackson 将 JSON 字符串字段转换为正确的类。 我有以下类(class): public class AnimalRecord { private String id
我正在使用 JsonTypeInfo 来处理系统读入的一些 JSON 对象的多态性。系统还将这些对象提供给其他服务。在某些情况下,我想要包括类型信息的详细对象,而在其他情况下,我想要对象的准系统最小
我尝试在应用程序的客户端序列化一个对象(来自 Enum ),并使用 jackson 在另一端(服务器端)将其反序列化为同一对象。我的客户端有这个枚举: @JsonTypeInfo(use = Json
假设我有一些像这样的 JSON [ { 'type' : { 'value': 'B' } }, {
我遇到了一种情况,我需要自定义某些 JSON 的序列化/反序列化。我已将其简化为一个可读的示例。我有一个 Container 类,其中包含实现 MyInterface 的对象。在我的示例中,Class
我是一名优秀的程序员,十分优秀!