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);
		}
	}
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java使用ObjectMapper的简单示例

    一.什么是ObjectMapper? ObjectMapper类是Jackson库的主要类,它提供一些功能将数据集或对象转换的实现. 它将使用JsonParser和JsonGenerator实例来实现JSON的实际读/写. 二.ObjectMapper怎么使用? 2.1 配置 2.1.1 普通Java项目(引入如下依赖即可) <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --

  • 如何利用Jackson序列化忽略指定类型的属性详解

    前言 本文准确来讲是探讨如何用 Jackson 来序列化 Apache avro 对象,因为简单用 Jackson 来序列化 Apache avro 对象会报错.原因是序列化 Schema getSchema() 时会报错,后面会讲到,需要序列化时忽略该属性.那么能不能在 getSchema() 上加上 @JsonIgnore 来忽略该属性呢?原理上是通的.不过手工修改的 avsc 生成的 Java 文件随时会因为重新编译而还原,所以不太具有实际可操作性,当然通过定制编译 avsc 用的模板文件

  • 举例讲解Java的Jackson库中ObjectMapper类的使用

    ObjectMapper类是Jackson库的主要类.它提供一些功能将转换成Java对象匹配JSON结构,反之亦然.它使用JsonParser和JsonGenerator的实例实现JSON实际的读/写. 类声明 以下是org.codehaus.jackson.map.ObjectMapper类的声明: public class ObjectMapper extends ObjectCodec implements Versioned 嵌套类 S.N. 类 & 描述 1 static class

  • Jackson库中objectMapper的用法

    Jackson库中objectMapper用法 ObjectMapper类是Jackson库的主要类.它提供一些功能将转换成Java对象与SON结构互相转换,在项目中遇到过,故记录一下. 在 pom.xml 加入依赖 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>

  • 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.jackso

  • Jackson序列化和反序列化忽略字段操作

    一.设置Jackson序列化时只包含不为空的字段 new ObjectMapper().setSerializationInclusion(Include.NON_NULL); 二.设置在反序列化时忽略在JSON字符串中存在,而在Java中不存在的属性 new ObjectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); 三.Jackson序列化时忽略字段的方式 1.方式一:FilterProvider a)在需

  • Gson序列化指定忽略字段的三种写法详解

    目录 1. transient关键字 2. expose注解 3. 自定义排查策略ExclusionStrategy 在我们日常使用json序列化框架过程中,经常会遇到在输出json字符串时,忽略某些字段,那么在Gson框架中,要想实现这种方式,可以怎么处理呢? 本文介绍几种常见的姿势 1. transient关键字 最容易想到的case,就是直接借助jdk的transient关键字来修饰不希望输出的对象,如 @Data @AllArgsConstructor @NoArgsConstructo

  • mybatis 实体类字段大小写问题 字段获取不到值的解决

    目录 mybatis实体类字段大小写问题 字段获取不到值 解决办法 推断 踩坑mybatis 转换大小写问题 解决方法 mybatis实体类字段大小写问题 字段获取不到值 由于前期设计问题,项目中需要用到的一个字段 rootpath,所以我再实体层加了这么一个字段. 然后,我在前台向后台传数据的时候,这个rootpath一直都获取不到值.经过排查对比,发现我写的set和get方法名称后面的RootPath 中的P字母大写导致的. 解决办法 将set和get方法后面的P改为小写p就可以了 推断 m

  • mybatis实体类字段大小写及字段获取不到值问题

    目录 mybatis实体类字段大小写及字段获取不到值 问题 解决办法 推断 mybatis下部分字段值无法获取(null) 解决之前 解决方法 mybatis实体类字段大小写及字段获取不到值 问题 由于前期设计问题,项目中需要用到的一个字段 rootpath,所以我再实体层加了这么一个字段. 然后,我在前台向后台传数据的时候,这个rootpath一直都获取不到值.经过排查对比,发现我写的set和get方法名称后面的RootPath 中的P字母大写导致的. 解决办法 将set和get方法后面的P改

  • mybatis 实现字段大小写赋值

    目录 mybatis 字段大小写赋值 遇到一个问题 在使用mybatis的请务必注意字段的大小写问题 insert时务必注意mapper的返回值类型 mybatis 字段大小写赋值 遇到一个问题 就是字段有大写的和小写的,比如username和userName,赋值的时候希望赋值给userName,但是赋值给了username,因为是mybatis,并不是set字段赋值,这个时候就需要resultMap了 <resultMap id="userMap" type="co

  • 详解如何利用Redis实现生成唯一ID

    目录 一.摘要 二.方案实践 2.1.引入 redis 组件 2.2.添加 redis 环境配置 2.3.编写服务验证逻辑,通过 aop 代理方式实现 2.4.在相关的业务接口上,增加SubmitLimit注解即可 三.小结 一.摘要 在上一篇文章中,我们详细的介绍了随着下单流量逐渐上升,为了降低数据库的访问压力,通过请求唯一ID+redis分布式锁来防止接口重复提交,流程图如下! 每次提交的时候,需要先调用后端服务获取请求唯一ID,然后才能提交. 对于这样的流程,不少的同学可能会感觉到非常鸡肋

  • jackson反序列化时如何忽略不需要的字段

    目录 jackson反序列化忽略字段 解决办法很简单 jackson忽略指定属性 例子 jackson反序列化忽略字段 JSON字符串中含有我们并不需要的字段,那么当对应的实体类中不含有该字段时,会抛出一个异常,告诉你有些字段没有在实体类中找到. 解决办法很简单 在声明ObjectMapper之后,加上上述代码: objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); jackson忽略指

  • mybatis plus怎么忽略映射字段

    其实mybatis plus是比mybatis优秀的mybatis有的,他全有,它没的,或者不优秀的地方,mybatis plus全优秀,所以晚的总比早的好. 今天要说的是: 忽略字段问题,我被这个坑了好长时间,我开发项目呐有个需求是忽略数据库中字段,但是实体类还要有,我操,我目前的知识告诉我,@Transient这个是很好的选择,我操,我于是,开始搞,忘了说了,我的数据库中间件是mybatis plus,搞的我烦,先是看网上的,发现无论在字段上加还是在get方法上加,都不行,最后我配置文件又试

  • Java开发中POJO和JSON互转时如何忽略隐藏字段的问题

    1. 前言 在Java开发中有时候某些敏感信息我们需要屏蔽掉,不能被消费这些数据的客户端知道.通常情况下我们会将其设置为null或者空字符 "",其实还有其它办法,如果你使用了Jackson的话.接下来我将以一个实际场景来告诉你可以怎么做. 2. Jackson如何忽略字段 这里都以JSON序列化为例.假如我们在业务中需要返回用户信息,已有的POJO是这样的: import lombok.Data; /** * @author felord.cn */ @Data public cla

随机推荐