ObjectMapper 如何忽略字段大小写
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.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 } }
结果如下
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); } }
执行后的结果如下
这些便是这几个属性的作用所以,由于第一个比较简单我就这样说一下吧
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); } } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。
相关文章
- 这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
- 这篇文章主要介绍了Mybatis Plus select 实现只查询部分字段的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-01
- 这篇文章主要介绍了mybatis-plus 返回部分字段的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-02
- 这篇文章主要介绍了postgresql数据添加两个字段联合唯一的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-04
- 本文记录的要实现的功能类似于 MySQL 中的 ORDER BY,上个项目中有遇到这样的一个需求。 要求:从两个不同的表中获取各自的4条数据,然后整合(array_merge)成一个数组,再根据数据的创建时间降序排序取前4条。 遇到这个...2014-06-07
- 一、1 CREATE TABLE NAME(name VARCHAR(10)); 对这个表,缺省情况下,下面两个查询的结果是一样的:复制代码 代码如下: SELECT * FROM TABLE NAME WHERE name='clip'; SELECT * FROM TABLE NAME WH...2015-03-15
- 这篇文章主要介绍了C#实现对字符串进行大小写切换的方法,涉及C#操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
C# Dynamic关键字之:调用属性、方法、字段的实现方法
本篇文章是对C#中调用属性、方法、字段的实现方法进行了详细的分析介绍,需要的朋友参考下...2020-06-25Mybatis Plus 字段为空值时执行更新方法未更新解决方案
这篇文章主要介绍了Mybatis Plus 字段为空值时执行更新方法未更新解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-03- 这篇文章主要介绍了linux grep不区分大小写查找字符串方法,需要的朋友可以参考下...2021-05-07
- 这篇文章主要介绍了postgresql 补齐空值、自定义查询字段并赋值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-16
MYSQL的binary解决mysql数据大小写敏感问题的方法
复制代码 代码如下:mysql> select binary 'ABCD'='abcd' COM1, 'ABCD'='abcd' COM2;+--------+-----------+| COM1 | COM2 |+--------+-----------+| 0 | 1 |+---------+-----------+1 row in set...2013-10-04解决ObjectMapper.convertValue() 遇到的一些问题
这篇文章主要介绍了解决ObjectMapper.convertValue() 遇到的一些问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-30- 这篇文章主要介绍了FastJSON字段智能匹配踩坑的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-18
- /*小写转大写*/var xcc= "12.22";document.write(xcc+"=>"+formatRMB(xcc)+"<br/>");/*大写转小写*/ var rrrr = "壹拾贰元贰角贰分";document.write(rrrr+"=>"+parseRMB(rrrr));输出结果: 12.22=>壹拾贰元贰角贰分 壹...2015-10-30
- 这篇文章详细介绍了Yii2定制表单输入字段的标签和样式的教程,有需要的同学可以参考一下,以备不时之需。 Yii2中对于表单和字段的支持组件为ActiveForm和ActiveField...2017-01-22
- 这篇文章主要介绍了Jackson 反序列化时实现大小写不敏感设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-29
- PHP大小写问题算是一个入门级的教程了,在此小编为php初学者介绍php开发中大小写的一些例子,希望可以帮助到各位。 今天写代码的时候发现自己代码的一处错误: $m_cate...2016-11-25
- 这篇文章主要介绍了Mybatis plus通用字段自动填充的示例,帮助大家更好的理解和使用Mybatis,感兴趣的朋友可以了解下...2021-01-31
perl uc,lc,ucfirst,lcfirst大小写转换函数
这篇文章主要介绍了perl 大小写字母转换函数,需要的朋友可以参考下...2020-06-29