解决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 相关文章推荐
Java Shutdown Hook场景使用及源码分析
Jun 15 Java/Android
使用Springboot实现健身房管理系统
Jul 01 Java/Android
Java实现聊天机器人完善版
Jul 04 Java/Android
Spring Cloud Gateway去掉url前缀
Jul 15 Java/Android
Java中try catch处理异常示例
Dec 06 Java/Android
springmvc直接不经过controller访问WEB-INF中的页面问题
Feb 24 Java/Android
你知道Java Spring的两种事务吗
Mar 16 Java/Android
SpringCloud Feign请求头删除修改的操作代码
Mar 20 Java/Android
详细介绍Java中的CyclicBarrier
Apr 13 Java/Android
Spring Boot 实现 WebSocket
Apr 30 Java/Android
springcloud整合seata
May 20 Java/Android
java实现web实时消息推送的七种方案
Jul 23 Java/Android
Java基础之详解HashSet的使用方法
Java实现多文件上传功能
Jun 30 #Java/Android
Java基础之线程锁相关知识总结
Jun 30 #Java/Android
详解Spring事件发布与监听机制
浅谈自定义校验注解ConstraintValidator
ObjectMapper 如何忽略字段大小写
Java常用函数式接口总结
You might like
PHP写入WRITE编码为UTF8的文件的实现代码
2008/07/07 PHP
php实现的RSS生成类实例
2015/04/23 PHP
php中遍历二维数组并以表格的形式输出的方法
2017/01/03 PHP
aspx中利用js实现确认删除代码
2010/07/22 Javascript
Javascript 中的 call 和 apply使用介绍
2012/02/22 Javascript
js写一个弹出层并锁屏效果实现代码
2012/12/07 Javascript
基于NodeJS的前后端分离的思考与实践(五)多终端适配
2014/09/26 NodeJs
jQuery中的ajax async同步和异步详解
2015/09/29 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
JavaScript实现显示函数调用堆栈的方法
2016/04/21 Javascript
JavaScript简单实现弹出拖拽窗口(二)
2016/06/17 Javascript
JS实现页面进入和返回定位到具体位置
2016/12/08 Javascript
jQuery中的siblings()是什么意思(推荐)
2016/12/29 Javascript
深入理解JavaScript中的预解析
2017/01/04 Javascript
JavaScript中闭包的详解
2017/04/01 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
微信小程序商品详情页规格属性选择示例代码
2017/10/30 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
JSON基本语法及与JavaScript的异同实例分析
2019/01/04 Javascript
js简单实现自动生成表格功能示例
2020/06/02 Javascript
浅谈vue中get请求解决传输数据是数组格式的问题
2020/08/03 Javascript
如何基于viewport vm适配移动端页面
2020/11/13 Javascript
[03:03]DOTA2校园争霸赛 济南城市决赛欢乐发奖活动
2013/10/21 DOTA
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
使用Python进行防病毒免杀解析
2019/12/13 Python
python中def是做什么的
2020/06/10 Python
python语言中有算法吗
2020/06/16 Python
Python学习之路之pycharm的第一个项目搭建过程
2020/06/18 Python
python实现登录与注册系统
2020/11/30 Python
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
学年自我鉴定范文
2013/10/01 职场文书
化学系大学生自荐信范文
2014/03/01 职场文书
股东授权委托书范文
2014/09/13 职场文书
2015年社会实践个人总结
2015/03/06 职场文书
运动会通讯稿50字
2015/07/20 职场文书
MySQL如何使用使用Xtrabackup进行备份和恢复
2021/06/21 MySQL