解决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的常用工具
Jun 11 Java/Android
解决ObjectMapper.convertValue() 遇到的一些问题
Jun 30 Java/Android
Java Kafka 消费积压监控的示例代码
Jul 01 Java/Android
使用logback实现按自己的需求打印日志到自定义的文件里
Aug 30 Java/Android
SpringBoot实现quartz定时任务可视化管理功能
Aug 30 Java/Android
Spring中的使用@Async异步调用方法
Nov 01 Java/Android
Java tomcat手动配置servlet详解
Nov 27 Java/Android
Netty客户端接入流程NioSocketChannel创建解析
Mar 25 Java/Android
Java详细解析==和equals的区别
Apr 07 Java/Android
详解Android中的TimePickerView(时间选择器)的用法
Apr 30 Java/Android
Java死锁的排查
May 11 Java/Android
httpclient调用远程接口的方法
Aug 14 Java/Android
Java基础之详解HashSet的使用方法
Java实现多文件上传功能
Jun 30 #Java/Android
Java基础之线程锁相关知识总结
Jun 30 #Java/Android
详解Spring事件发布与监听机制
浅谈自定义校验注解ConstraintValidator
ObjectMapper 如何忽略字段大小写
Java常用函数式接口总结
You might like
php下几个常用的去空、分组、调试数组函数
2009/02/22 PHP
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
2012/03/07 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
PHP SPL标准库之接口(Interface)详解
2015/05/11 PHP
PHP正则表达式过滤html标签属性(DEMO)
2016/05/04 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
2019/08/27 PHP
Laravel相关的一些故障解决
2020/08/19 PHP
js中Image对象以及对其预加载处理示例
2013/11/20 Javascript
js返回前一页刷新本页重载页面
2014/07/29 Javascript
node.js中的console.log方法使用说明
2014/12/09 Javascript
JS实现的仿QQ空间图片弹出效果代码
2016/02/23 Javascript
JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
2016/06/21 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
2016/12/12 Javascript
AngularJS ui-router (嵌套路由)实例
2017/03/10 Javascript
javascript中this用法实例详解
2017/04/06 Javascript
Seajs源码详解分析
2019/04/02 Javascript
微信小程序缓存过期时间的使用详情
2019/05/12 Javascript
微信小程序使用车牌号输入法的示例代码
2019/08/20 Javascript
微信小程序实现星级评价
2019/11/20 Javascript
JS实现容器模块左右拖动效果
2020/01/14 Javascript
Python中endswith()函数的基本使用
2015/04/07 Python
Python中扩展包的安装方法详解
2017/06/14 Python
朴素贝叶斯Python实例及解析
2018/11/19 Python
浅谈keras中loss与val_loss的关系
2020/06/22 Python
基于python模拟TCP3次握手连接及发送数据
2020/11/06 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
美国第一香水网站:Perfume.com
2017/01/23 全球购物
StubHub新加坡:购买和出售全球活动门票
2017/03/10 全球购物
C#中有没有运算符重载?能否使用指针?
2014/05/05 面试题
请问软件开发中的设计模式你会使用哪些
2015/05/13 面试题
如何清空Session
2015/02/23 面试题
市场开发与营销专业求职信范文
2014/05/01 职场文书
销售人员求职信
2014/07/22 职场文书
党员先进性教育整改措施
2014/09/18 职场文书
2015新年寄语(一句话)
2014/12/08 职场文书
python 爬取吉首大学网站成绩单
2021/06/02 Python