Jackson

Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。

多态类型的处理

jackson允许配置多态类型处理,当进行反序列话时,JSON数据匹配的对象可能有多个子类型,为了正确的读取对象的类型,我们需要添加一些类型信息。可以通过下面几个注解来实现:

@JsonTypeInfo

作用于类/接口,被用来开启多态类型处理,对基类/接口和子类/实现类都有效

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.PROPERTY,property = "name")

这个注解有一些属性,

use:定义使用哪一种类型识别码,它有下面几个可选值:

1、JsonTypeInfo.Id.CLASS:使用完全限定类名做识别

2、JsonTypeInfo.Id.MINIMAL_CLASS:若基类和子类在同一包类,使用类名(忽略包名)作为识别码

3、JsonTypeInfo.Id.NAME:一个合乎逻辑的指定名称

4、JsonTypeInfo.Id.CUSTOM:自定义识别码,由@JsonTypeIdResolver对应,稍后解释

5、JsonTypeInfo.Id.NONE:不使用识别码

include(可选):指定识别码是如何被包含进去的,它有下面几个可选值:

1、JsonTypeInfo.As.PROPERTY:作为数据的兄弟属性

2、JsonTypeInfo.As.EXISTING_PROPERTY:作为POJO中已经存在的属性

3、JsonTypeInfo.As.EXTERNAL_PROPERTY:作为扩展属性

4、JsonTypeInfo.As.WRAPPER_OBJECT:作为一个包装的对象

5、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在子类上制定)

@JsonTypeName

作用于子类,用来为多态子类指定类型标识符的值

比如:

@JsonTypeName(value = "sub1")

使用参考

配置参考

最新文章

  1. iOS Swift-元组tuples(The Swift Programming Language)
  2. warnin php startup in unknown on line 0:
  3. jshint配置(js检查)
  4. Mac电脑清理硬盘"其他"
  5. [转] CentOS单独安装Apache Benchmark压力测试工具的办法
  6. spring配置带参数的视图解析器:ParameterMethodNameResolver
  7. CSS选择器从右向左的匹配规则
  8. 使用zabbix监控mysql的三种方式
  9. 多线程编程 - PHP 实现
  10. Spark源码剖析(六):Worker原理与源码剖析
  11. ThinkPHP 数据库操作(六) : 查询事件、事务操作、监听SQL
  12. 【搜索2】P1706 全排列问题
  13. Educational Codeforces Round 25
  14. Beta冲刺 (3/7)
  15. GridView实现拖拽排序以及数据交互
  16. MySQL使用的常见问题
  17. 基于设备树的TQ2440 DMA学习(1)—— 芯片手册
  18. Jmeter分布式
  19. 008单例、继承、final
  20. HighCharts常用设置

热门文章

  1. Python简要标准库(5)
  2. 1030 Travel Plan (30 分)(最短路径 and dfs)
  3. 机器学习 (三) 逻辑回归 Logistic Regression
  4. React错误总结(三)
  5. mongodb数据库操作之简单查询
  6. AtomicIntegerFieldUpdater使用
  7. PAT 1089 狼人杀-简单版
  8. Codeforces Round #383 (Div. 1) C(二分图)
  9. [SCOI2010]序列操作 线段树
  10. oracle设置自动清理归档日志脚本