解决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
Java如何实现树的同构?
Jun 22 Java/Android
java设计模式--原型模式详解
Jul 21 Java/Android
Java org.w3c.dom.Document 类方法引用报错
Aug 07 Java/Android
springboot 多数据源配置不生效遇到的坑及解决
Nov 17 Java/Android
springboot中的pom文件 project报错问题
Jan 18 Java/Android
Spring this调用当前类方法无法拦截的示例代码
Mar 20 Java/Android
Java中API的使用方法详情
Apr 06 Java/Android
Java8利用Stream对列表进行去除重复的方法详解
Apr 14 Java/Android
Mybatis-Plus 使用 @TableField 自动填充日期
Apr 26 Java/Android
Java版 单机五子棋
May 04 Java/Android
Android 中的类文件和类加载器详情
Jun 05 Java/Android
Java基础之详解HashSet的使用方法
Java实现多文件上传功能
Jun 30 #Java/Android
Java基础之线程锁相关知识总结
Jun 30 #Java/Android
详解Spring事件发布与监听机制
浅谈自定义校验注解ConstraintValidator
ObjectMapper 如何忽略字段大小写
Java常用函数式接口总结
You might like
php中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
PHP中数组的分组排序实例
2014/06/01 PHP
完美解决thinkphp验证码出错无法显示的方法
2014/12/09 PHP
php使用fputcsv()函数csv文件读写数据的方法
2015/01/06 PHP
php抓取并保存网站图片的实现代码
2015/10/28 PHP
Redis构建分布式锁
2017/03/28 PHP
PHP实现的猴王算法(猴子选大王)示例
2018/04/30 PHP
Javascript中的数学函数集合
2007/05/08 Javascript
javascript 可以拖动的DIV(二)
2009/06/26 Javascript
基于jquery的$.ajax async使用
2011/10/19 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
Javascript ES6中数据类型Symbol的使用详解
2017/05/02 Javascript
JS中的Replace()传入函数时的用法详解
2017/09/11 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
基于vue cli重构多页面脚手架过程详解
2018/01/23 Javascript
JavaScript中concat复制数组方法浅析
2019/01/20 Javascript
详解vue组件中使用路由方法
2019/02/12 Javascript
vue使用nprogress实现进度条
2019/12/09 Javascript
JS实现简易留言板特效
2019/12/23 Javascript
使用rpclib进行Python网络编程时的注释问题
2015/05/06 Python
python使用htmllib分析网页内容的方法
2015/05/08 Python
python处理二进制数据的方法
2015/06/03 Python
PyQt5每天必学之事件与信号
2018/04/20 Python
解决Django加载静态资源失败的问题
2019/07/28 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
2019/09/25 Python
python读文件的步骤
2019/10/08 Python
python文件读写代码实例
2019/10/21 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
在keras中实现查看其训练loss值
2020/06/16 Python
HTML5本地存储之IndexedDB
2017/06/16 HTML / CSS
幼儿园感恩节活动方案
2014/10/06 职场文书
单位介绍信格式范文
2015/05/04 职场文书
jquery插件实现搜索历史
2021/04/24 jQuery
帮你提高开发效率的JavaScript20个技巧
2021/06/18 Javascript
Oracle 临时表空间SQL语句的实现
2021/09/25 Oracle
vscode内网访问服务器的方法
2022/06/28 Servers