(1)初级

我们从几个简单的使用场景开始:重命名属性,忽略属性,以及修改属性所使用的类型。

注意:下面的例子仅仅显示了成员属性(field properties),注解同样也可以用在成员方法(getter/setter)上。

①属性重命名时使用的注解

最常见的使用方式之一就是改变某个成员属性所使用的JSON名称,例如:

public class Name {

@JsonProperty("firstName")

public String _first_name;

}

将会生成如下所示的JSON数据结果:

{ "firstName" : "Bob" }

而不是:

{ "_first_name" : "Bob"}

②忽略属性时使用的注解

有时POJO包括了一些你不希望输出的属性,在这种情况下,你可以进行如下操作:

public class Value {

public int value;

@JsonIgnore public int internalValue;

}

这时得到的JSON数据结果如下:

{ "value" : 42 }

或者,你可能忽略掉某些从JSON数据中得到的属性,如果是这样,你可以使用:

@JsonIgnoreProperties({ "extra", "uselessValue" })

public class Value {

public int value;

}

这样就能够处理像如下所示的JSON数据:

{ "value" : 42, "extra" : "fluffy", "uselessValue" : -13 }

最后,你甚至能简单地忽略掉从JSON(由于在应用中没有完全匹配的POJO)中获得的所有“多余的”属性。你可以通过添加如下代码完成这个操作:

@JsonIgnoreProperties(ignoreUnknown=true)

public class PojoWithAny {

public int value;

}

③选择更多/更少(more/less)指定类型(specific types)时使用的注解

在有些情况下,Jackson在读入或输出一个成员属性时,所选用的类型(type)可能并不是你想要的:

?当读取(反序列化)时,声明的类型(declared type)可能是一个基本类型(general type),但是你确切地知道应该使用的实现类型(译注:也就说,我们需要反序列化后生成的对象是实现类型的);

?当输出(序列化)时,Jackson默认使用的是给定的运行时类型(the specific runtime type);但是你可能不想输出那个类型的所有信息,而仅仅是它的父类型所囊括的信息。

在这些应用场景,你可以使用如下的注解进行处理:

public class ValueContainer {

// 虽然代码中使用的类型(type)是'Value', 但我们希望读取到的JSON 之后得到的对象的类型是'ValueImpl'

@JsonDeserialize(as=ValueImpl.class)

public Value value;

// 虽然运行时的类型(type)可能是'AdvancedType'(高级类型), 但是我们确实想序列化

// 成为'BasicType'(基础类型); 有两种处理方式:

@JsonSerialize(as=BasicType.class)

// 或者我们可以这样: @JsonSerialize(typing=Typing.STATIC)

public BasicType another;

}

(2)中级

①使用构造器或工厂方法

在默认情况下,当由JSON数据创建相应类的实例时,Jackson尝试使用该类的“默认”构造器(即无参数构造器)。不过,你可以选择使用其他的构造器,或者一个静态工厂方法,来创建实例。完成这个操作,你需要使用@JsonCreator注解,有可能还需要使用@JsonProperty注解给参数(arguments)绑定名称。

public class CtorPOJO {

private final int _x, _y;

@JsonCreator

public CtorPOJO(@JsonProperty("x") int x, @JsonProperty("y") int y) {

_x = x;

_y = y;

}

}

使用相同的方式,可以将@JsonCreator用在静态工厂方法上。不过,还有一个可选的替代方案,被称作“授权式”构建器(“delegating” creator):

public class DelegatingPOJO {

private final int _x, _y;

@JsonCreator

public DelegatingPOJO(Map delegate) {

_x = (Integer) delegate.get("x");

_y = (Integer) delegate.get("y");

}

}

不同之处在于,构建器方法只能有一个参数,而且参数一定不要(must NOT)添加@JsonProperty注解。

②处理多态类型(polymorphic types)

如果你要进行读取、输出操作的对象拥有许多可能的子类型(即表现出多态性),你可能还需要添加一些类型信息。Jackson在反序列化时(读取JSON数据,生成相应的对象)需要这些信息,以便能正确地读取对象的类型。我们可以通过在“基本类型”上添加@JsonTypeInfo注解来完成操作:

//将Java类的名称(“com.myempl.ImplClass”)存储到JSON的一个名称为“class”的属性中

@JsonTypeInfo(use=Id.CLASS, include=As.PROPERTY,property=”class”)

public abstract class BaseClass {

}

public class Impl1 extends BaseClass {

public int x;

}

public class Impl2 extends BaseClass {

public String name;

}

public class PojoWithTypedObjects {

public List items;

}

这样,序列化之后的JSON格式如下:

{“items” : [

{“class”:”Impl2”,  “name”: “Bob”},

{“class”:”Impl1”, :”x” : 13}

]}

注意:这个注解还有很多配置可以进行设置,详细内容请查阅浏览:

? Javadocs

? 多态类型处理简介I(ntro to polymorphic type handling)

③重新设置属性的自动发现(Changing property auto-detection)

Jackson默认的属性发现规则将会查找到如下所述的属性:

?所有被public修饰的字段(成员变量);

?所有被public修饰的getter(即形如“getXxx()”的方法);

?所有被public修饰的setter(即形如“setXxx(value)”的方法),不管可见或不可见。

不过如果这样也不行,你可以通过使用使用注解@JsonAutoDetect来改变可见级别。如果你想自动发现所有的字段(就像GSON包所进行的操作那样),你可以这样做:

@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY)

public class POJOWithFields {

private int value;

}

或者,你想禁用对所有字段的自动发现:

@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.NONE)

public class POJOWithNoFields {

//不会被序列化,除非再有一个可以访问的“getValue”方法

public int value;

}

java json注解_java json注解相关推荐

  1. java有哪些注解_JAVA常用注解

    JDK自带注解 @Override 重写, 标识覆盖它的父类的方法 @Deprecated   已过期,表示方法是不被建议使用的 @Suppvisewarnings 压制警告,抑制警告 元注解 @Ta ...

  2. java annotation入门_JAVA - Annotation 注解 入门

    Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ...

  3. java 获取类的注解_Java 自定义注解通过反射获取类、方法、属性上的注解

    反射 JAVA中的反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变.通俗的讲就是反射可以在运行时根据指定的类名获得类的信息. 注解的定义 注解通过 @interface 关键 ...

  4. java自定义字段_Java自定义注解实战

    注解简介 注解的本质是一个接口,该接口默认继承Annotation接口,使用@interface进行定义.注解主要有三类:元注解.自定义注解以及框架定义的注解. 接口里面的成员方法称为注解的属性 定义 ...

  5. java类注释_java中注解

    一.什么是注解 注解是jdk5.0引入的新技术! 注解(Annotation):java中对某一程序片段注释说明.这个注释说明能被其它程序读到并执行相应操作! 二.注解的作用 1.能对于程序做出解释, ...

  6. java 获取接口的注解_java反射注解妙用-获取所有接口说明

    前言 最近在做项目权限,使用shiro实现restful接口权限管理,对整个项目都进行了重构.而权限管理需要用到所有的接口配置,包括接口url地址,接口唯一编码等.想要收集所有的接口信息,如果工程接口 ...

  7. java jackson包_java json工具包Jackson的使用

    官方的五分钟入门文档: 国内某位同仁的翻译版(算是翻译版吧) 除了这些简单的应用外,有时还会遇到一些比较特殊的场景 pojo的字段名与实际的属性名不一样 某些属性不需要作json转换 字段以指定的顺序 ...

  8. java 导出excel 注解_Java基于注解和反射导入导出Excel

    list = ei.getDataList(User.class); for (User user : list){ try{ //to do: 保存/处理数据 //userService.save( ...

  9. java运行时读取注解_Java自定义注解和运行时靠反射获取注解

    转:1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰 ...

最新文章

  1. Struts2中的拦截器与过滤器学习
  2. C#中Split函数的使用
  3. 配置 Keepalived + LVS-DR模式, 实现高可用和负载均衡
  4. kafka数据可靠性深度解读
  5. CG-CTF-Web-SQL注入1
  6. 查询链接服务器信息,SQL Server链接服务器
  7. 蓝桥杯 历届试题 小数第n位
  8. ECCV 2020 论文大盘点-人体形状与姿态估计篇
  9. LVM的创建扩展缩减与删除
  10. Druid手动创建连接的坑
  11. 视频课程:高等数学考研辅导讲座-上
  12. python用的编程软件是什么,python编程软件用哪个好
  13. JMX详解及JConsole使用
  14. 风力、风向角度 换算
  15. [WP]第五届XMan选拔赛web
  16. 随着计算机科学,行测真题_随着科学技术的发展,人机交流已经成为现实_步知行测...
  17. vim学习笔记-常用命令
  18. 前台图片压缩转换base64提交到后台
  19. 一个点的经度和纬度,以这个点为圆心,1000米为半径,最大的经度和纬度,最小的经度和纬度...
  20. pandas 利用 正则表达式 从文本中提取数字

热门文章

  1. chatgpt plus 会员插件中文简介
  2. 理想汽车新考核体系:OKR升级为PBC,绩效周期延长至半年
  3. 人脸检测:在公共交通场所监控中起什么样的作用?
  4. 什么是原子性,什么是原子性操作
  5. RA(RouterAdvertisement) and DHCPv6
  6. 【SciSpace】人工智能太强大了!文献阅读版ChatGPT,一站式科研文献阅读工具 - 知识点目录
  7. 用后处理做一个烟雾的效果(也可以用指数雾达到类似的效果)
  8. 【小林课堂】【光学】光的折射与色散
  9. 【数据福利】三种冰川编目数据
  10. 红外遥控编解码注意事项