解决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 相关文章推荐
Feign调用全局异常处理解决方案
Jun 24 Java/Android
mybatis 解决从列名到属性名的自动映射失败问题
Jun 30 Java/Android
详细了解MVC+proxy
Jul 09 Java/Android
SpringBoot整合Mybatis Generator自动生成代码
Aug 23 Java/Android
SpringDataJPA实体类关系映射配置方式
Dec 06 Java/Android
Java9新特性之Module模块化编程示例演绎
Mar 16 Java/Android
Java后端 Dubbo retries 超时重试机制的解决方案
Apr 14 Java/Android
JAVA 线程池(池化技术)的实现原理
Apr 28 Java/Android
带你了解Java中的ForkJoin
Apr 28 Java/Android
Qt数据库应用之实现图片转pdf
Jun 01 Java/Android
java.util.NoSuchElementException原因及两种解决方法
Jun 28 Java/Android
springboot+rabbitmq实现智能家居实例详解
Jul 23 Java/Android
Java基础之详解HashSet的使用方法
Java实现多文件上传功能
Jun 30 #Java/Android
Java基础之线程锁相关知识总结
Jun 30 #Java/Android
详解Spring事件发布与监听机制
浅谈自定义校验注解ConstraintValidator
ObjectMapper 如何忽略字段大小写
Java常用函数式接口总结
You might like
php 仿Comsenz安装效果代码打包提供下载
2010/05/09 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
JavaScript中的isXX系列是否继续使用的分析
2011/04/16 Javascript
读jQuery之四(优雅的迭代)
2011/06/20 Javascript
javascript对talbe进行动态添加、删除、验证实现代码
2012/03/29 Javascript
Javascript实现页面跳转的几种方式分享
2013/10/26 Javascript
js showModalDialog 弹出对话框的简单实例(子窗体)
2014/01/07 Javascript
ExtJS4如何给同一个formpanel不同的url
2014/05/02 Javascript
Vue form 表单提交+ajax异步请求+分页效果
2017/04/22 Javascript
浅谈Express异步进化史
2017/09/09 Javascript
利用Vue2.x开发实现JSON树的方法
2018/01/04 Javascript
详解基于Node.js的HTTP/2 Server实践
2018/05/31 Javascript
jquery 动态遍历select 赋值的实例
2018/09/12 jQuery
浅析vue 函数配置项watch及函数 $watch 源码分享
2018/11/22 Javascript
puppeteer实现html截图的示例代码
2019/01/10 Javascript
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
layui使用form表单实现post请求页面跳转的方法
2019/09/14 Javascript
浅析Vue 防抖与节流的使用
2019/11/14 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
2020/10/27 Javascript
python中定义结构体的方法
2013/03/04 Python
Python iter()函数用法实例分析
2018/03/17 Python
详解django+django-celery+celery的整合实战
2019/03/19 Python
如何基于python3和Vue实现AES数据加密
2020/03/27 Python
Python中内建模块collections如何使用
2020/05/27 Python
matplotlib之属性组合包(cycler)的使用
2021/02/24 Python
HTML5 Canvas实现玫瑰曲线和心形图案的代码实例
2014/04/10 HTML / CSS
AmazeUI 图标的示例代码
2020/08/13 HTML / CSS
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
农场厂长岗位职责
2013/12/28 职场文书
群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
第二批党的群众路线教育实践活动总结报告
2014/10/30 职场文书
幼儿园小朋友毕业感言
2015/07/30 职场文书
志愿者工作心得体会
2016/01/15 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书
Python内置数据结构列表与元组示例详解
2021/08/04 Python
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server