ObjectMapper 如何忽略字段大小写


Posted in Java/Android onJune 29, 2021

ObjectMapper 忽略字段大小写

核心代码:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);

例子:

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper; 
public class Test{
    public static void main(String[] args) {
  try {
   A a = new A();
   a.lastname = "jack";
   ObjectMapper mapper = new ObjectMapper();
   mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
   mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
   A2 convertValue = new A2();
     mapper.updateValue(convertValue, a);
   System.out.println(convertValue);
  } catch (JsonMappingException e) {
   e.printStackTrace();
  }
 }
 
 public static class A{
  String lastname; 
  public String getLastname() {
   return lastname;
  }
 
  public void setLastname(String lastname) {
   this.lastname = lastname;
  } 
 }
 
 public static class A2{
  String lastName;
 
  public String getLastName() {
   return lastName;
  }
 
  public void setLastName(String lastName) {
   this.lastName = lastName;
  }
 
  @Override
  public String toString() {
   return "A2 [lastName=" + lastName + "]";
  }   
 }
}

ObjectMapper 的一些坑

相信做过Java 开发对这个类应该不陌生,没错,这个类是jackson提供的,主要是用来把对象转换成为一个json字符串返回到前端,

现在大部分数据交换都是以json来传输的,所以这个很重要,那你到底又对这个类有着有多少了解呢,下面我说一下我遇到的一些坑

首先,先把我要说的几个坑需要设置的属性贴出来先

ObjectMapper objectMapper = new ObjectMapper();
  
  //序列化的时候序列对象的所有属性
  objectMapper.setSerializationInclusion(Include.ALWAYS);
  
  //反序列化的时候如果多了其他属性,不抛出异常
  objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  
  //如果是空对象的时候,不抛异常
  objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
  
  //取消时间的转化格式,默认是时间戳,可以取消,同时需要设置要表现的时间格式
  objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
  objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"))

简单说一下这个类的基本用法,以下采用代码块加截图的形式来说明和部分文字件数

package com.shiro.test; 
import java.text.SimpleDateFormat;
import java.util.Date; 
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature; 
public class Main2 {
 public static void main(String[] args) throws Exception{
  ObjectMapper objectMapper = new ObjectMapper();
  //序列化的时候序列对象的所有属性
  objectMapper.setSerializationInclusion(Include.ALWAYS);
  //取消时间的转化格式,默认是时间戳,可以取消,同时需要设置要表现的时间格式
  objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
  objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
  
  Person person = new Person(1, "zxc", new Date());
  //这是最简单的一个例子,把一个对象转换为json字符串
  String personJson = objectMapper.writeValueAsString(person);
  System.out.println(personJson);
  
  //默认为true,会显示时间戳
  objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
  personJson = objectMapper.writeValueAsString(person);
  System.out.println(personJson);
 }
}

输出的信息如下

ObjectMapper 如何忽略字段大小写

objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)的作用

package com.shiro.test; 
import java.text.SimpleDateFormat;
import java.util.Date; 
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature; 
public class Main2 {
	public static void main(String[] args) throws Exception{
		ObjectMapper objectMapper = new ObjectMapper();
		//序列化的时候序列对象的所有属性
		objectMapper.setSerializationInclusion(Include.ALWAYS);
		//如果是空对象的时候,不抛异常,也就是对应的属性没有get方法
		objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
		
		Person person = new Person(1, "zxc", new Date());
 
		String personJson = objectMapper.writeValueAsString(person);
		System.out.println(personJson);
		
		//默认是true,即会抛异常
		objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, true);
		personJson = objectMapper.writeValueAsString(person);
		System.out.println(personJson);	
	}
}

对应的person类此时为

package com.shiro.test; 
import java.util.Date; 
public class Person { 
	private Integer id;
	private String name;
	private Date birthDate;
//	public Integer getId() {
//		return id;
//	}
//	public void setId(Integer id) {
//		this.id = id;
//	}
//	public String getName() {
//		return name;
//	}
//	public void setName(String name) {
//		this.name = name;
//	}
//	public Date getBirthDate() {
//		return birthDate;
//	}
//	public void setBirthDate(Date birthDate) {
//		this.birthDate = birthDate;
//	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", birthDate=" + birthDate + "]";
	}
	public Person(Integer id, String name, Date birthDate) {
		super();
		this.id = id;
		this.name = name;
		this.birthDate = birthDate;
	}	
	public Person() {
		// TODO Auto-generated constructor stub
	}
}

结果如下

ObjectMapper 如何忽略字段大小写

package com.shiro.test; 
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper; 
public class Main2 {
	public static void main(String[] args) throws Exception{
		ObjectMapper objectMapper = new ObjectMapper();
		//序列化的时候序列对象的所有属性
		objectMapper.setSerializationInclusion(Include.ALWAYS);
		//反序列化的时候如果多了其他属性,不抛出异常
		objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
		
//		Person person = new Person(1, "zxc", new Date());
 
//		String personJson = objectMapper.writeValueAsString(person);
//		System.out.println(personJson);
		
		//注意,age属性是不存在在person对象中的
		String personStr = "{\"id\":1,\"name\":\"zxc\",\"age\":\"zxc\"}";
		
		Person person = objectMapper.readValue(personStr, Person.class);
		System.out.println(person);
		
		//默认为true
		objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
		person = objectMapper.readValue(personStr, Person.class);
		System.out.println(person);		
	}
}

执行后的结果如下

ObjectMapper 如何忽略字段大小写

这些便是这几个属性的作用所以,由于第一个比较简单我就这样说一下吧

Include.ALWAYS 是序列化对像所有属性

Include.NON_NULL 只有不为null的字段才被序列化

Include.NON_EMPTY 如果为null或者 空字符串和空集合都不会被序列化

然后再说一下如何把一个对象集合转换为一个 Java里面的数组

package com.shiro.test; 
import java.util.ArrayList;
import java.util.Date;
import java.util.List; 
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper; 
public class Main2 {
	public static void main(String[] args) throws Exception{
		ObjectMapper objectMapper = new ObjectMapper();
		//序列化的时候序列对象的所有属性
		objectMapper.setSerializationInclusion(Include.NON_DEFAULT);
		
		Person person1 = new Person(1, "zxc", new Date());
		Person person2 = new Person(2, "ldh", new Date());
		
		List<Person> persons = new ArrayList<>();
		persons.add(person1);
		persons.add(person2);
		
		//先转换为json字符串
		String personStr = objectMapper.writeValueAsString(persons);
		
		//反序列化为List<user> 集合,1需要通过 TypeReference 来具体传递值
		List<Person> persons2 = objectMapper.readValue(personStr, new TypeReference<List<Person>>() {});
		
		for(Person person : persons2) {
			System.out.println(person);
		}
		
		//2,通过 JavaType 来进行处理返回
		JavaType javaType = objectMapper.getTypeFactory().constructParametricType(List.class, Person.class);
		List<Person> persons3 = objectMapper.readValue(personStr, javaType);
		
		for(Person person : persons3) {
			System.out.println(person);
		}
	}
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Java/Android 相关文章推荐
如何解决springcloud feign 首次调用100%失败的问题
Jun 23 Java/Android
详解Java实现设计模式之责任链模式
Jun 23 Java/Android
HashMap实现保存两个key相同的数据
Jun 30 Java/Android
JavaGUI模仿QQ聊天功能完整版
Jul 04 Java/Android
mybatis3中@SelectProvider传递参数方式
Aug 04 Java/Android
Spring Boot项目传参校验的最佳实践指南
Apr 05 Java/Android
零基础学java之循环语句的使用
Apr 10 Java/Android
带你了解Java中的ForkJoin
Apr 28 Java/Android
Java 死锁解决方案
May 11 Java/Android
Android中的Launch Mode详情
Jun 05 Java/Android
Spring JPA 增加字段执行异常问题及解决
Jun 10 Java/Android
Java+swing实现抖音上的表白程序详解
Jun 25 Java/Android
Java常用函数式接口总结
分析并发编程之LongAdder原理
SpringBoot整合JWT的入门指南
jackson json序列化实现首字母大写,第二个字母需小写
Java数组与堆栈相关知识总结
分析JVM源码之Thread.interrupt系统级别线程打断
Jun 29 #Java/Android
Jackson 反序列化时实现大小写不敏感设置
Jun 29 #Java/Android
You might like
PHP4与PHP3中一个不兼容问题的解决方法
2006/10/09 PHP
PHP运行时强制显示出错信息的代码
2011/04/20 PHP
php全局变量和类配合使用深刻理解
2013/06/05 PHP
php 伪造ip以及url来路信息方法汇总
2014/11/25 PHP
php二维数组按某个键值排序的实例讲解
2019/02/15 PHP
选择TreeView控件的树状数据节点的JS方法(jquery)
2010/02/06 Javascript
JSON 和 JavaScript eval使用说明
2010/06/13 Javascript
原生js写的放大镜效果
2012/08/22 Javascript
jquery数据验证插件(自制,简单,练手)实例代码
2013/10/24 Javascript
js点击出现悬浮窗效果不使用JQuery插件
2014/01/20 Javascript
Jquery中ajax方法data参数的用法小结
2014/02/12 Javascript
JS清空多文本框、文本域示例代码
2014/02/24 Javascript
改变状态栏文字的js代码
2014/06/13 Javascript
jQuery实现拖拽效果插件的方法
2015/03/23 Javascript
使用js复制链接中的部分文字的方法
2015/07/30 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
2016/11/29 Javascript
jquery 实现复选框的全选操作实例代码
2017/01/24 Javascript
jQuery实现frame之间互通的方法
2017/06/26 jQuery
jQuery开源组件BootstrapValidator使用详解
2017/06/29 jQuery
JSON基本语法及与JavaScript的异同实例分析
2019/01/04 Javascript
layui表格内容溢出的解决方法
2019/09/06 Javascript
layui layer select 选择被遮挡的解决方法
2019/09/21 Javascript
Nodejs实现WebSocket代码实例
2020/05/19 NodeJs
nuxt 每个页面head标签内容设置方式
2020/11/05 Javascript
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
用不到50行的Python代码构建最小的区块链
2017/11/16 Python
酷! 程序员用Python带你玩转冲顶大会
2018/01/17 Python
Django 允许局域网中的机器访问你的主机操作
2020/05/13 Python
使用python实现时间序列白噪声检验方式
2020/06/03 Python
美国专营婴幼儿用品的购物网站:buybuy BABY
2017/01/01 全球购物
小学生推普周国旗下讲话稿
2014/09/21 职场文书
新娘父亲婚礼致辞
2015/07/27 职场文书
毕业典礼致辞
2015/07/29 职场文书
父亲节感言
2015/08/03 职场文书
详解运行Python的神器Jupyter Notebook
2021/06/03 Python
Spring实现内置监听器
2021/07/09 Java/Android