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 相关文章推荐
Netty结合Protobuf进行编解码的方法
Jun 26 Java/Android
Java中PriorityQueue实现最小堆和最大堆的用法
Jun 27 Java/Android
jackson json序列化实现首字母大写,第二个字母需小写
Jun 29 Java/Android
mybatis 解决从列名到属性名的自动映射失败问题
Jun 30 Java/Android
Mybatis-plus在项目中的简单应用
Jul 01 Java/Android
Springboot配置suffix指定mvc视图的后缀方法
Jul 03 Java/Android
logback如何自定义日志存储
Aug 30 Java/Android
Java实现学生管理系统(IO版)
Feb 24 Java/Android
springboot+zookeeper实现分布式锁
Mar 21 Java/Android
Java字符串逆序方法详情
Mar 21 Java/Android
Java数组详细介绍及相关工具类
Apr 14 Java/Android
Android Studio实现简易进制转换计算器
May 20 Java/Android
Java常用函数式接口总结
分析并发编程之LongAdder原理
SpringBoot整合JWT的入门指南
jackson json序列化实现首字母大写,第二个字母需小写
Java数组与堆栈相关知识总结
分析JVM源码之Thread.interrupt系统级别线程打断
Jun 29 #Java/Android
Jackson 反序列化时实现大小写不敏感设置
Jun 29 #Java/Android
You might like
php循环语句 for()与foreach()用法区别介绍
2012/09/05 PHP
php简单统计中文个数的方法
2016/09/30 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
2018/05/31 PHP
JQuery Study Notes 学习笔记(一)
2010/08/04 Javascript
Extjs EditorGridPanel中ComboBox列的显示问题
2011/07/04 Javascript
web网页按比例显示图片实现原理及js代码
2013/08/09 Javascript
谈一谈bootstrap响应式布局
2016/05/23 Javascript
Javascript中的数组常用方法解析
2016/06/17 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
详解升级react-router 4 踩坑指南
2017/08/14 Javascript
vuex操作state对象的实例代码
2018/04/25 Javascript
express.js中间件说明详解
2019/03/19 Javascript
Javascript 对象(object)合并操作实例分析
2019/07/30 Javascript
Vue自定义组件的四种方式示例详解
2020/02/28 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
Python下的常用下载安装工具pip的安装方法
2015/11/13 Python
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
tensorflow 1.0用CNN进行图像分类
2018/04/15 Python
Centos下实现安装Python3.6和Python2共存
2018/08/15 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
python实点云分割k-means(sklearn)详解
2020/05/28 Python
Tensorflow全局设置可见GPU编号操作
2020/06/30 Python
日本索尼音乐商店:Sony Music Shop
2018/07/17 全球购物
说出ArrayList,Vector, LinkedList的存储性能和特性
2015/01/04 面试题
幼师专业毕业生自荐信
2013/09/29 职场文书
销售主管岗位职责
2014/02/08 职场文书
记帐员岗位责任制
2014/02/08 职场文书
合作协议书格式
2014/08/19 职场文书
户籍证明模板
2014/09/28 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
检察院起诉书
2015/05/20 职场文书
nginx前后端同域名配置的方法实现
2021/03/31 Servers
Go语言入门exec的基本使用
2022/05/20 Golang