公用技术——数据格式——JSON——Jackson类库——序列化——属性,键映射关系

摘要:
//json字符串中name属性的对应部分是{“userName”:与集合1.3@JsonAlias对应的反序列化过程将@JsonAlias注释添加到属性“dateValue”})publicclassUser{}//按属性字母@JsonPropertyOrder(字母=true)publicclassUser{}3排序。在关系属性和键值之间存在两个1对1的映射关系,

  通常情况下,对象的属性与JSON键的关系是一对一,键的顺序是根据属性的顺序,键的名称是与属性的名称保持一致的。

Jackson有很多注解可以修改以上三种关系。首先从属性名称与键名称开始。

1、名称

1.1     @JsonProperty

在属性上添加@JsonProperty注解,给value赋值可以修改对应的键名称,例如User对象存在name属性,示例如下:

// json字符串中name属性对应的部分为{"userName":""}
@JsonProperty("userName")
private String name;

1.2   @JsonGetter & @JsonSetter

当属性不存在,只有get和set方法时,可以在set方法上添加@JsonSetter,get方法上添加@JsonGetter。

@JsonGetter("userName")
public String getName() {
    return name;
}

@JsonSetter("userName")
public void setName(String name) {
    this.name = name;
}

  二者的值可以不同,get对应的是序列化过程,set对应的反序列化过程

1.3   @JsonAlias

在属性上添加@JsonAlias注解,它的value为一个字符串数组,此时键名称可以是多个,在反序列化过程中,都可以映射为属性。

2、顺序

在类上添加@JsonPropertyOrder注解,可以自定义顺序,也可以按照属性名称字母排序。

@JsonPropertyOrder({"stringValue","intValue","listValue","dateValue"})
public class User{}
// 按照属性字母排序
@JsonPropertyOrder(alphabetic = true)
public class User {}

3、关系

属性与键值的映射关系有两种1对1, 1对0。

不存在一个属性生成多个键值的情形。

1对1为默认的关系。

1对0的情况,即在序列化过程中忽略该属性。实现方式有以下几种:

3.1     @JsonIgnore

在属性上添加@JsonIgnore注解,忽略该属性

@JsonIgnore
private String name;

3.2     @JsonIgnoreProperties

  在类上添加@JsonIgnoreProperties注解,批量忽略属性

// 忽略User对象中的name和age属性
@JsonIgnoreProperties({"name","age"})
public class User {}

3.3     @JsonIgnoreType

在该属性的类型上添加@JsonIgnoreType注解,例如User存在Address类型的属性

// User对象无需修改
@JsonIgnoreType
public class Address {}

3.4     @JsonAutoDetect

默认情况下,序列化时,只检测public修饰符的属性,若没有,会继续查找public修饰的get和set方法。

在类上添加@JsonAutoDect注解,给fieldVisibility赋值可以修改这种情况。它的值有以下几种类型,default对应默认情况

default:默认的规则

any包含所有的属性

none:不包含任何属性

non_private包含除private修饰的属性。

protected_and_public:包含protected和public修饰的属性

public_only仅包含public修饰的属性。

// 不包含private属性
@JsonAutoDetect(fieldVisibility= JsonAutoDetect.Visibility.NON_PRIVATE)
public class User{}

3.5     @JsonInclude

在类上,或属性上,或get或set方法上添加@JsonInclude注解,它是根据属性值进行判断是否包含属性,它的value值有以下六种类型

JsonInclude.Include.Always包含所有的属性,它是默认值。

JsonInclude.Include.NON_NULL不包含值为null的属性,当属性为集合类型时,为List时,不包含null值。为Map时,不包含key为null或value为null的键值对。

JsonInclude.Include.NON_ABSENT不包含引用为null的属性,即属性不是基本数据类型,它的引用指向null。同时包含NON_NULL情形。

JsonInclude.Include.NON_EMPTY不包含值为空的属性,属性值为空有以下五种场景NON_NULL; NON_ABSENT; 集合的isEmpty方法返回true; 数组的length为0;字符串的长度为0。

JsonInclude.Include.NON_DEFAULT不包含值为默认值,或为空的属性。例如int类型的属性值为0,布尔类型的属性值为false。

JsonInclude.Include.CUSTOM,使用时配置过滤器,过滤器方法返回false时,不包含该属性。

JsonInclude.Include.USE_DEFAULT,默认情形,通常用于覆盖作用域更广的值。例如类上存在NON_NULL, 在属性上指定USE_DEFAULT。

// 集合类型时使用contentFilter
@JsonInclude(value = JsonInclude.Include.CUSTOM, 
valueFilter = UserNameFilter.class)
private String name;

// 过滤器,重写equals方法,返回false时不包含
public class UserNameFilter {

    @Override
    public boolean equals(Object object){
        if (object == null || !(object instanceof String)) {
            return false;
        }
        String name = (String)object;
        return name.length() == name.trim().length();
    }
}

3.6     @JsonView

@JsonView相当于tag,根据tag为属性进行分组,例如创建必须的和可选的JsonView

public class JacksonView {
    // 可选的
    public interface OptionalView{}
    // 必然的
    public interface NecessaryView{}
}

  在属性上添加@JsonView注解

@JsonView(value = JacksonView.NecessaryView.class)
private String name;

  后续调用ObjectMapper的writerWithView方法

om.writerWithView(JacksonView.NecessaryView.class).writeValueAsString(customer);

3.7     @JsonFilter

@JsonFilter用于在序列化过程中添加过滤器,步骤如下。

第一步,在类上添加@JsonFilter注解,设置value属性,它为Filter的ID,假设值为”testFilter”

@JsonFilter("testFilter")
public class User {
}

  第二步,在序列化过程中创建SimpleFilterProvider对象,调用addFilter方法,第一个参数为Filter的ID, 第二个参数为PropertyFilter的子类。

SimpleFilterProvider filterProvider = new SimpleFilterProvider();
filterProvider.addFilter("testFilter",
      SimpleBeanPropertyFilter.filterOutAllExcept("name", "sex"));

  第三步,调用ObjectMapper对象的setFilterProvider方法。

om.setFilterProvider(filterProvider);

  具体参考SimpleBeanPropertyFilter对象。

免责声明:文章转载自《公用技术——数据格式——JSON——Jackson类库——序列化——属性,键映射关系》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux下screen工具的简单使用SQLite 参数化查询下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Jmeter之关联——常用提取器

Jmeter关联所谓关联,从业务角度讲,即:某些操作步骤与其相邻步骤存在一定的依赖关系,导致某个步骤的输入数据来源于上一步的返回数据,这时就需要“关联”来建立步骤之间的联系。 简单来说,就是:将上一个请求的响应结果作为下一个请求的参数。。。 这里的提取器,都可以作为jmeter中关联的使用。 一、边界提取器 参数:前三个就不做介绍了; (4)匹配数字:-1...

[转]SIFT,SURF,ORB,FAST 特征提取算法比较

转载地址:https://blog.csdn.net/vonzhoufz/article/details/46461849 主要的特征检测方法有以下几种,在一般的图像处理库中(如opencv, VLFeat, Boofcv等)都会实现。 FAST ,Machine Learning for High-speed Corner Detection, 200...

文件加锁(基于FileChannel)

      JDK1.4引入了文件加锁机制。它允许我们同步访问某个作为共享资源的文件。不过,竞争同一文件的两个线程可能在不同的Java虚拟机上,或者一个是Java线程,另一个是操作系统中的其他的某个本地线程。文件加锁对其他的操作系统进程是可见的,因为Java的文件加锁直接映射到了本地操作系统的枷锁工具。       通过对FileChannel调用tryL...

jQuery中的ajax

jQuery对Ajax操作进行了封装,在jQuery中$.ajax()方法属于最底层的方法,第2层是load()、$.get()和$.post()方法,第3层是$.getScript()和$.getJSON()方法。第2层的方法使用频率最高。 1. load()方法 1.1  载入HTML文档 load()方法是jQuery中最为简单和常用的Ajax方法,...

WPF 实现已绑定集合项目的移除时动画过渡

信不信由你,这个场景貌似没有官方的完美解决方案。我认为这个要求一点都不过分,花了很长时间 bai google du,就是没找到好的方案。这是我花了一天时间才搞通的一个方案,跟大家分享,虽然仍然不太完美,但是希望对大家有用。 对完美的憧憬 一个已绑定到 ItemsControl 的集合,是不能通过 ItemsControl.Items 属性来访问的,如果你...

总结PLSQL的快捷键以及使用技巧

http://www.dedecms.com/knowledge/data-base/oracle/2012/0724/3643.html 最近在开发过程中,遇到一些麻烦,就是开发效率问题,有时候其他同事使用PLSQL 编程效率明显高于自己,观察了好久,才发现他使用PLSQL 已经很长时间了而且,他自己也在其中添加了好多快捷方式,      1、登录后默认...