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


Posted in Java/Android onJune 30, 2021

源代码:

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;

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

Java/Android 相关文章推荐
详解SpringBoot异常处理流程及原理
Jun 21 Java/Android
Java多条件判断场景中规则执行器的设计
Jun 26 Java/Android
SpringCloud的JPA连接PostgreSql的教程
Jun 26 Java/Android
Java实现房屋出租系统详解
Oct 05 Java/Android
Spring Security中用JWT退出登录时遇到的坑
Oct 16 Java/Android
零基础学java之循环语句的使用
Apr 10 Java/Android
Android自定义双向滑动控件
Apr 19 Java/Android
Java 多线程协作作业之信号同步
May 11 Java/Android
Java服务调用RestTemplate与HttpClient的使用详解
Jun 21 Java/Android
Spring boot admin 服务监控利器详解
Aug 05 Java/Android
Java Spring读取和存储详细操作
Aug 05 Java/Android
Android移动应用开发指南之六种布局详解
Sep 23 Java/Android
Java基础之详解HashSet的使用方法
Java实现多文件上传功能
Jun 30 #Java/Android
Java基础之线程锁相关知识总结
Jun 30 #Java/Android
详解Spring事件发布与监听机制
浅谈自定义校验注解ConstraintValidator
ObjectMapper 如何忽略字段大小写
Java常用函数式接口总结
You might like
真正面向对象编程:PHP5.01发布
2006/10/09 PHP
《PHP编程最快明白》第六讲:Mysql数据库操作
2010/11/01 PHP
使用php get_headers 判断URL是否有效的解决办法
2013/04/27 PHP
php获取指定(访客)IP所有信息(地址、邮政编码、国家、经纬度等)的方法
2015/07/06 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
2020/04/26 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
2007/01/29 Javascript
用js小类库获取浏览器的高度和宽度信息
2012/01/15 Javascript
window.event.keyCode兼容IE和Firefox实现js代码
2013/05/30 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
easyui Draggable组件实现拖动效果
2015/08/19 Javascript
基于jquery实现ajax无刷新评论
2020/08/19 Javascript
微信开发 消息推送实现代码
2016/10/21 Javascript
ES2015 Symbol 一种绝不重复的值
2016/12/25 Javascript
B/S(Web)实时通讯解决方案分享
2017/04/06 Javascript
angularjs过滤器--filter与ng-repeat配合有奇效
2017/04/20 Javascript
laravel5.4+vue+element简单搭建的示例代码
2017/08/29 Javascript
jQuery无冲突模式详解
2019/01/17 jQuery
微信小程序按顺序同步执行的两种方式
2019/12/20 Javascript
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
Python如何为图片添加水印
2016/11/25 Python
Python 实现随机数详解及实例代码
2017/04/15 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
CSS3常用的几种颜色渐变模式总结
2016/11/18 HTML / CSS
介绍一下XMLHttpRequest对象
2012/02/12 面试题
银行求职信个人范文
2013/12/16 职场文书
爽歪歪广告词
2014/03/20 职场文书
研究生考核个人自我鉴定
2014/03/27 职场文书
气象学专业个人求职信
2014/04/22 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
离婚协议书格式范本
2016/03/18 职场文书
创业计划书之DIY自助厨房
2019/09/06 职场文书
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js
Python中如何处理常见报错
2022/01/18 Python
如何用六步教会你使用python爬虫爬取数据
2022/04/06 Python