解决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 14 Java/Android
如何解决springcloud feign 首次调用100%失败的问题
Jun 23 Java/Android
Feign调用传输文件异常的解决
Jun 24 Java/Android
Java中PriorityQueue实现最小堆和最大堆的用法
Jun 27 Java/Android
logback 实现给变量指定默认值
Aug 30 Java/Android
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
Sep 25 Java/Android
JAVA API 实用类 String详解
Oct 05 Java/Android
关于Spring配置文件加载方式变化引发的异常详解
Jan 18 Java/Android
java后台调用接口及处理跨域问题的解决
Mar 24 Java/Android
Flutter集成高德地图并添加自定义Maker的实践
Apr 07 Java/Android
Android开发之底部导航栏的快速实现
Apr 28 Java/Android
SpringBoot Http远程调用的方法
Aug 14 Java/Android
Java基础之详解HashSet的使用方法
Java实现多文件上传功能
Jun 30 #Java/Android
Java基础之线程锁相关知识总结
Jun 30 #Java/Android
详解Spring事件发布与监听机制
浅谈自定义校验注解ConstraintValidator
ObjectMapper 如何忽略字段大小写
Java常用函数式接口总结
You might like
音乐朗读剧《MARS RED》2021年TV动画化决定!
2020/03/06 日漫
php 引用(&amp;)详解
2009/11/20 PHP
JS宝典学习笔记(下)
2007/01/10 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
浅谈javascript中replace()方法
2015/11/10 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
浅谈angular4生命周期钩子
2017/09/05 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
JQuery选中select组件被选中的值方法
2018/03/08 jQuery
vue filters的使用详解
2018/06/11 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
2020/05/12 Javascript
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
Django后台获取前端post上传的文件方法
2018/05/28 Python
Python3中关于cookie的创建与保存
2018/10/21 Python
python使用threading.Condition交替打印两个字符
2019/05/07 Python
django 基于中间件实现限制ip频繁访问过程详解
2019/07/30 Python
python语言的优势是什么
2020/06/17 Python
python 实现客户端与服务端的通信
2020/12/23 Python
德国网上药房:Apotal
2017/04/04 全球购物
万代美国官网:PREMIUM BANDAI USA
2020/09/11 全球购物
什么是smarty? Smarty的优点是什么?
2013/08/11 面试题
编程用JAVA解析XML的方式
2013/07/07 面试题
财务出纳岗位职责
2014/02/03 职场文书
企业人事任命书
2014/06/05 职场文书
学雷锋标语
2014/06/25 职场文书
党支部创先争优活动总结
2014/08/28 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
党的群众路线教育实践活动个人对照检查材料(企业)
2014/11/05 职场文书
计算机实训报告总结
2014/11/05 职场文书
开幕式邀请函
2015/01/31 职场文书
讲座新闻稿
2015/07/18 职场文书
高中信息技术教学反思
2016/02/16 职场文书
详解CocosCreator项目结构机制
2021/04/14 Javascript
只需要100行Python代码就可以实现的贪吃蛇小游戏
2021/05/27 Python
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle