解决ObjectMapper.convertValue() 遇到的一些问题

 更新时间:2021年06月29日 16:59:45   作者:STRIVE.ZCR  
这篇文章主要介绍了解决ObjectMapper.convertValue() 遇到的一些问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

源代码:

public <T> T convertValue(Object fromValue, TypeReference<?> toValueTypeRef) throws IllegalArgumentException { return (T) _convert(fromValue, _typeFactory.constructType(toValueTypeRef)); }

该方法用于用jackson将bean转换为map

例子:

List<SObject> sObjects = new ObjectMapper().convertValue(map.get("list"), new TypeReference<List<SObject>>() { });

微服务中从其他服务获取过来的对象,如果从Object强转为自定义的类型会报错,利用ObjectMapper转换。

ObjectMapper mapper = new ObjectMapper();
DefaultResponse defaultResponse = proxy.getData();
List<Resource> resources = (<Resource>) defaultResponse.getData();  //这里的场景是:data是一个Object类型的,但是它其实是一个List<Resouce>,想把List中的每个对象分别转成可用的对象
for (int i = 0; i < serviceDateResources.size(); i++) {
    Resource resource = mapper.convertValue(resources.get(i), Resource.class);   //经过这步处理,resource就是可用的类型了,如果不转化会报错
}

在转换过程中有些属性被设置为空,这样就不需要转化

处理方法:

在需要转化的实体类商添加如下注解

@JsonInclude(Include.NON_NULL) 
@JsonInclude(Include.Include.ALWAYS) 默认 
@JsonInclude(Include.NON_DEFAULT) 属性为默认值不序列化 
@JsonInclude(Include.NON_EMPTY) 属性为 空(“”) 或者为 NULL 都不序列化 
@JsonInclude(Include.NON_NULL) 属性为NULL 不序列化 

jackson objectMapper json字符串、对象bean、map、数组list互相转换常用的方法列举:

ObjectMapper mapper = new ObjectMapper();

1.对象转json字符串

User user=new User();
String userJson=mapper.writeValueAsString(user);

2.Map转json字符串

Map map=new HashMap();  
String json=mapper.writeValueAsString(map);

3.数组list转json字符串

Student[] stuArr = {student1, student3};  
String jsonfromArr =  mapper.writeValueAsString(stuArr);

4.json字符串转对象

String expected = "{\"name\":\"Test\"}";
User user = mapper.readValue(expected, User.class);

5.json字符串转Map

String expected = "{\"name\":\"Test\"}";
Map userMap = mapper.readValue(expected, Map.class);

6.json字符串转对象数组List

String expected="[{\"a\":12},{\"b\":23},{\"name\":\"Ryan\"}]";
CollectionType listType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, User.class);
List<User> userList = mapper.readValue(expected, listType);

7.json字符串转Map数组List<Map<String,Object>>

String expected="[{\"a\":12},{\"b\":23},{\"name\":\"Ryan\"}]";
CollectionType listType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, Map.class);
List<Map<String,Object>> userMapList = mapper.readValue(expected, listType);

8.jackson默认将对象转换为LinkedHashMap:

String expected = "[{\"name\":\"Ryan\"},{\"name\":\"Test\"},{\"name\":\"Leslie\"}]";
ArrayList arrayList = mapper.readValue(expected, ArrayList.class);

9.json字符串与list或map互转的方法

ObjectMapper objectMapper = new ObjectMapper();
 //遇到date按照这种格式转换
 SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 objectMapper.setDateFormat(fmt);
 
  String preference = "{name:'侯勇'}";
        //json字符串转map
  Map<String, String> preferenceMap = new HashMap<String, String>();
  preferenceMap = objectMapper.readValue(preference, preferenceMap.getClass());
  
  //map转json字符串
  String result=objectMapper.writeValueAsString(preferenceMap);

10.bean转换为map

List<Map<String,String>> returnList=new ArrayList<Map<String,String>>();
List<Menu> menuList=menuDAOImpl.findByParentId(parentId);
ObjectMapper mapper = new ObjectMapper();
//用jackson将bean转换为map
returnList=mapper.convertValue(menuList,new TypeReference<List<Map<String, String>>>(){});

objectMapper.convertValue() 报错

报错信息如下:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of java.time.LocalDateTime (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: net.too1.tplus.user.user.entity.User[“createTime”])

根据以上报错得知, 是java.time.LocalDateTime类型的原因. ObjectMapper 不能对LocalDateTime 序列化. 加上以下注解即可解决

@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@ApiModelProperty(value = "创建时间")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime createTime;

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

相关文章

  • 手把手教你写一个spring IOC容器的方法

    手把手教你写一个spring IOC容器的方法

    这篇文章主要介绍了手把手教你写一个spring IOC容器的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 实战干货之基于SpringBoot的RabbitMQ多种模式队列

    实战干货之基于SpringBoot的RabbitMQ多种模式队列

    RabbitMQ 是一个由Erlang语言开发的AMQP的开源实现,支持多种客户端。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗,下文将带你深入了解 RabbitMQ 多种模式队列
    2021-09-09
  • SpringBoot2.7 WebSecurityConfigurerAdapter类过期配置

    SpringBoot2.7 WebSecurityConfigurerAdapter类过期配置

    这篇文章主要为大家介绍了SpringBoot2.7中WebSecurityConfigurerAdapter类过期应该如何配置,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • springboot启动feign项目报错:Service id not legal hostnam的解决

    springboot启动feign项目报错:Service id not legal hostnam的解决

    这篇文章主要介绍了springboot启动feign项目报错:Service id not legal hostnam的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 浅谈springboot 属性定义

    浅谈springboot 属性定义

    本篇文章主要介绍了浅谈springboot 属性定义,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Springboot的maven间接依赖的实现

    Springboot的maven间接依赖的实现

    这篇文章主要介绍了Springboot的maven间接依赖的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Java并发编程-volatile可见性详解

    Java并发编程-volatile可见性详解

    这篇文章主要介绍了Java并发编程-volatile可见性详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • SpringBoot获取当前运行环境三种方式小结

    SpringBoot获取当前运行环境三种方式小结

    在使用SpringBoot过程中,我们只需要引入相关依赖,然后在main方法中调用SpringBootApplication.run(应用程序启动类.class)方法即可,那么SpringBoot是如何获取当前运行环境呢,接下来由小编给大家介绍一下SpringBoot获取当前运行环境三种方式,需要的朋友可以参考下
    2024-01-01
  • IDEA实现JDBC的操作步骤

    IDEA实现JDBC的操作步骤

    JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,本文给大家介绍IDEA实现JDBC的操作步骤,感兴趣的朋友一起看看吧
    2022-01-01
  • mybatis中sql语句CDATA标签的用法说明

    mybatis中sql语句CDATA标签的用法说明

    这篇文章主要介绍了mybatis中sql语句CDATA标签的用法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论