位置: IT常识 - 正文

ObjectMapper转化对象常用方法(转LIst、Map,以及Type、JavaType、constructType的学习)(object转map工具类)

编辑:rootadmin
ObjectMapper转化对象常用方法(转LIst、Map,以及Type、JavaType、constructType的学习) 文章目录1. 前言2. 先说结论3. 快速入门1. 常用转对象、List、Map(复习常用的方式)2. 使用constructType方式4. 其他1. 前言

推荐整理分享ObjectMapper转化对象常用方法(转LIst、Map,以及Type、JavaType、constructType的学习)(object转map工具类),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:objectmapper转map,object转map对象,object转map对象,object转map工具类,object转map对象,objectmapper将对象转为json,object转map对象,objectmapper转map,内容如对您有帮助,希望把文章链接给更多的朋友!

在工作中,必然少不了JSON转化对象,而一般来说JSON的转化,要么就是在controller层,springboot帮忙转化好了,要么就是很简单的常转List、Map等等。

而在学习Feign的时候,可以自定义Decoder解析器,对返回报文做个性化处理,但这个时候,对方返回的数据就需要自己将json字符串转为对应的对象了。

而在自己转化的时候,发现ObjectMapper提供如下两个方法:

一个是class类型的参数,一个是JavaType类型的参数,而该decode方法中,只有Type类型。

这个时候不经会发问几个问题:

如何将feign请求到的返回数据转为对象呢?Type类型是什么东西,在decoder方法中要怎么转化呢?如果可以转化了,那复杂的对象又要如何书写代码呢?

上述问题是在我学习feign自定义解析器解析返回报文时候出现的,如何自定义解析一个复杂的报文

从而衍生出:ObjectMapper转化对象方法到底有哪些?

2. 先说结论通常转对象使用方式是 objectMapper.readValue(String jsonStr, Class<T> clazz);转List、Map使用方式是 objectMapper.readValue(String jsonStr, TypeReference<T> valueTypeRef); 例子如下: List: objectMapper.readValue(json, new TypeReference<List<JsonPerson>>() {}); Map: objectMapper.readValue(json, new TypeReference<Map<String, JsonPerson>>() {});使用constructType方式 转化对象,就是提前把需要转成的对象的类型先构造出来,之后就交给objectMapper直接反序列化即可。常用创建类型的方法:objectMapper.constructType() 直接创建对应的类型出来,如创建单对象的类型:objectMapper.constructType(T.class)objectMapper.getTypeFactory().constructParametricType() 创建带有参数化的类型,如转List:objectMapper.getTypeFactory().constructParametricType(List.class, T.class).3. 快速入门准备实体类如下: @Getter @ToString static class JsonPerson { private String name; private String pwd; }1. 常用转对象、List、Map(复习常用的方式)

对象,直接指明对象的class类

private static void json(ObjectMapper objectMapper) throws JsonProcessingException { String json = "{\n" + " \"name\":\"test-name\",\n" + " \"pwd\":\"test-pwd\"\n" + " }"; final JsonPerson jsonPerson = objectMapper.readValue(json, JsonPerson.class); System.out.println(jsonPerson); }

List 一种直接指明ArrayList的class类

// 指明ArrayList的class类的方式 private static void json2(ObjectMapper objectMapper) throws JsonProcessingException { String json2 = "[{\n" + " \"name\":\"test-name\",\n" + " \"pwd\":\"test-pwd\"\n" + " }]"; final List<JsonPerson> jsonPersonList2 = objectMapper.readValue(json2, ArrayList.class); System.out.println(jsonPersonList2); }

另一种使用TypeReference(一般都是用这种)

private static void json3(ObjectMapper objectMapper) throws JsonProcessingException {String json3 = "[{\n" +" \"name\":\"test-name\",\n" +" \"pwd\":\"test-pwd\"\n" +" }]";final List<JsonPerson> jsonPersonList = objectMapper.readValue(json3, new TypeReference<List<JsonPerson>>() {});System.out.println(jsonPersonList);}

Map跟List同理,有两种方式 一种直接指明Map的class类

private static void json4(ObjectMapper objectMapper) throws JsonProcessingException { String json4 = "{\n" + " \"TestData1\": {\n" + " \"name\": \"test-name\",\n" + " \"pwd\": \"test-pwd\"\n" + " },\n" + " \"TestData2\": {\n" + " \"name\": \"test-name2\",\n" + " \"pwd\": \"test-pwd2\"\n" + " }\n" + "}"; final Map<String, JsonPerson> jsonPersonMap = objectMapper.readValue(json4, Map.class); System.out.println(jsonPersonMap); }ObjectMapper转化对象常用方法(转LIst、Map,以及Type、JavaType、constructType的学习)(object转map工具类)

另一种使用TypeReference(一般都是用这种)

private static void json5(ObjectMapper objectMapper) throws JsonProcessingException {String json5 = "{\n" +" \"TestData1\": {\n" +" \"name\": \"test-name\",\n" +" \"pwd\": \"test-pwd\"\n" +" },\n" +" \"TestData2\": {\n" +" \"name\": \"test-name2\",\n" +" \"pwd\": \"test-pwd2\"\n" +" }\n" +"}";final Map<String, JsonPerson> jsonPersonMap = objectMapper.readValue(json5, new TypeReference<Map<String, JsonPerson>>() {});System.out.println(jsonPersonMap);}

2. 使用constructType方式

constructType方式:根据输入的参数先构建出需要转化的java类型

直接看例子: 先看普通的对象:

private static void json6(ObjectMapper objectMapper) throws JsonProcessingException { String json6 = "{\n" + " \"name\":\"test-name\",\n" + " \"pwd\":\"test-pwd\"\n" + " }"; // 构建JsonPerson类型的转化对象 final JavaType javaType = objectMapper.constructType(JsonPerson.class); // 告诉objectMapper:json6字符串需要转为 javaType的类型,即就是JsonPerson类 final JsonPerson jsonPerson = objectMapper.readValue(json6, javaType); System.out.println(jsonPerson); }

有人就会说,这很弱鸡呀,还不如直接objectMapper.readValue(json, class),别着急,上述是转简单对象的操作而已,这只是先让大家初步认识constructType。

先看例子中objectMapper.constructType(JsonPerson.class);这个方法源码:

public JavaType constructType(Type t) { // 先校验非空 _assertNotNull("t", t); // 使用类型工厂 创建t类型的类型 return _typeFactory.constructType(t); }

此时产生第一个问题:Type类是什么,如果没上述例子,第一次看见这个方法,我们怎么知道要传入什么参数呢?

需要补充一下其他知识点,Type是什么:

Type是Java 编程语言中所有类型的公共高级接口。简单来说:所有的数据类型的类型都是Type, Class也是继承自Type的,再通俗来说,Type就是所有数据类型的“爹”。Type的直接子接口(也就是Type具体有哪些类型): 1.ParameterizedType: 表示一种参数化的类型,比如Collection,即普通的泛型。 2.TypeVariable:是各种类型变量的公共父接口,就是泛型里面的类似T、E。 3.GenericArrayType:表示一种元素类型是参数化类型或者类型变量的数组类型,比如List<>[],T[]这种。 4.WildcardType:代表一种通配符类型表达式,类似? super T这样的通配符表达式。下面是找到比较好并且参考的资料, 大家看看他们写的代码例子,应该可以理解这高深的话语了:

对java-Type的理解java中的TypeTYPE JAVA类型

看完第六大点,就可以解决第五大点的问题,如果还不能理解,就通俗到把Type就认为是类型,constructType就是理解为构造要转化什么java类型。

接下来我们看第二个例子:转List对象:

private static void json7(ObjectMapper objectMapper) throws JsonProcessingException { String json7 = "[{\n" + " \"name\":\"test-name\",\n" + " \"pwd\":\"test-pwd\"\n" + " }]"; // 获取Type的工厂 final TypeFactory typeFactory = objectMapper.getTypeFactory(); // 创建 JsonPerson的Type类型 final JavaType jsonPersonType = typeFactory.constructType(JsonPerson.class); // 因为转化的是List<JsonPerson>类型 // 则也就是要创建有参数的Type类型 // 即 constructParametricType(List.class, jsonPersonType)---> List<JsonPerson> final JavaType javaType = typeFactory.constructParametricType(List.class, jsonPersonType); // 反序列化 final List<JsonPerson> jsonPersonList = objectMapper.readValue(json7, javaType); // 得到结果集 System.out.println(jsonPersonList); }

若上述的注释可以看的懂,其实也可以用下面简单方式(已有api):

private static void json8(ObjectMapper objectMapper) throws JsonProcessingException {String json8 = "[{\n" +" \"name\":\"test-name\",\n" +" \"pwd\":\"test-pwd\"\n" +" }]";// 获取Type的工厂final TypeFactory typeFactory = objectMapper.getTypeFactory();// 因为转化的是List<JsonPerson>类型// 直接API constructCollectionType 创建集合类型// 得到Collection<T>类型final JavaType javaType = typeFactory.constructCollectionType(List.class, JsonPerson.class);// 反序列化final List<JsonPerson> jsonPersonList = objectMapper.readValue(json8, javaType);// 得到结果集System.out.println(jsonPersonList);}

接下来第三个例子:转Map<String, JsonPerson>类型,其实也是大同小异,也是两种方式,细节如下:

private static void json9(ObjectMapper objectMapper) throws JsonProcessingException { String json9 = "{\n" + " \"TestData1\": {\n" + " \"name\": \"test-name\",\n" + " \"pwd\": \"test-pwd\"\n" + " },\n" + " \"TestData2\": {\n" + " \"name\": \"test-name2\",\n" + " \"pwd\": \"test-pwd2\"\n" + " }\n" + "}"; // 获取Type的工厂 final TypeFactory typeFactory = objectMapper.getTypeFactory(); // 因为转化的是Map<String, JsonPerson>类型 // 主类型是Map.class 然后就是key value的类型:String.class JsonPerson.class final JavaType javaType = typeFactory.constructParametricType(Map.class, String.class, JsonPerson.class); // 也可以使用这种方式 // final JavaType javaType = typeFactory.constructMapType(Map.class, String.class, JsonPerson.class); // 反序列化 final Map<String,JsonPerson> jsonPersonMap = objectMapper.readValue(json9, javaType); // 得到结果集 System.out.println(jsonPersonMap); }

为了节约时间,我们将直接给个高级的例子:转为JsonResponse<Map<String,List<JsonPerson>>> 对象:

// 为什么需要这一层呢?// 1. 接口的返回值将会封装为下述结构体,当调用方接受到报文的时候,可以直接优先判断code即返回码,可快速知道这次请求到底是成功还是失败// 若失败,则直接读取错误信息message,若成功,直接读取data数据。// 2. 也是给会报错的代码打个标志,若出错误了,可以快速根据code返回码,判断对应代码是那段出问题,快速定位。 @Getter @ToString static class JsonResponse<T> { private String code; private String message; private T data; } @Getter @ToString static class JsonPerson { private String name; private String pwd; } private static void json11(ObjectMapper objectMapper) throws JsonProcessingException {String json11 = "{\n" +" \"code\": \"success\",\n" +" \"data\": {\n" +" \"TestData1\": [\n" +" {\n" +" \"name\": \"test-data-name-one\",\n" +" \"pwd\": \"test-data-pwd-one\"\n" +" },\n" +" {\n" +" \"name\": \"test-data-name-two\",\n" +" \"pwd\": \"test-data-pwd-two\"\n" +" }\n" +" ],\n" +" \"TestData2\": [\n" +" {\n" +" \"name\": \"test-data2-name-one\",\n" +" \"pwd\": \"test-data2-pwd-one\"\n" +" },\n" +" {\n" +" \"name\": \"test-data2-name-two\",\n" +" \"pwd\": \"test-data2-pwd-two\"\n" +" }\n" +" ]\n" +" }\n" +"}";// 获取Type的工厂final TypeFactory typeFactory = objectMapper.getTypeFactory();// 因为转化的是JsonResponse<Map<String,List<JsonPerson>>> 类型 由里到外,一层层创建对应类型// 先创建List<JsonPerson> 类型final JavaType listJsonPersonType = typeFactory.constructCollectionType(List.class, JsonPerson.class);// 由于 constructMapType方法有如下两种:// 1. constructMapType(Class<? extends Map> mapClass,Class<?> keyClass, Class<?> valueClass)// 2. constructMapType(Class<? extends Map> mapClass, JavaType keyType, JavaType valueType)// 对应的key value入参,要不都是class,要不都是JavaType 类型// 因此需要把Map中的String先创建 JavaType 类型final JavaType stringType = typeFactory.constructType(String.class);// 再创建Map<String,List<JsonPerson>> 类型final JavaType mapType = typeFactory.constructMapType(Map.class, stringType, listJsonPersonType);// 再创建JsonResponse<Map<String,List<JsonPerson>>> 类型final JavaType lastType = typeFactory.constructParametricType(JsonResponse.class, mapType);// 反序列化final JsonResponse<Map<String,List<JsonPerson>>> jsonResponse = objectMapper.readValue(json11, lastType);// 得到结果System.out.println(jsonResponse);}

4. 其他对于怎么实现Feign的自定义Decoder解析器,等写到Feign知识点的时候再说吧,提前剧透一下,Feign真的很有意思。
本文链接地址:https://www.jiuchutong.com/zhishi/283714.html 转载请保留说明!

上一篇:Windows7系统无法启用休眠,提示拒绝访问的解决方(win7系统无法启动怎么处理)

下一篇:cpqdfwag.exe是什么进程 能结束吗 cpqdfwag进程查询

  • 网站推广的优化方法100条(完整版)(网站推广优化建设方案)

    网站推广的优化方法100条(完整版)(网站推广优化建设方案)

  • 网络推广方案:知己知彼 了解行业数据 (卫浴网络推广方案)

    网络推广方案:知己知彼 了解行业数据 (卫浴网络推广方案)

  • 华为p40有智能遥控功能吗(华为p40智能遥控器)

    华为p40有智能遥控功能吗(华为p40智能遥控器)

  • 抖音卸载了聊天记录还有吗(抖音卸载了聊天消息还会在吗)

    抖音卸载了聊天记录还有吗(抖音卸载了聊天消息还会在吗)

  • 荣耀20双扬声器打开方法(荣耀20双扬声器还是单扬声器)

    荣耀20双扬声器打开方法(荣耀20双扬声器还是单扬声器)

  • 苹果11视频有回音什么原因(苹果11视频有回音怎么解决)

    苹果11视频有回音什么原因(苹果11视频有回音怎么解决)

  • 淘宝店可以注销吗(淘宝店可以注销吗怎么注销)

    淘宝店可以注销吗(淘宝店可以注销吗怎么注销)

  • 微信号已被限制登录是什么意思(微信号已被限制登录怎么解除)

    微信号已被限制登录是什么意思(微信号已被限制登录怎么解除)

  • 快手为什么出现暂不支持音乐(快手为什么出现可能认识的人)

    快手为什么出现暂不支持音乐(快手为什么出现可能认识的人)

  • 为什么iphone11没有查找我的iphone(为什么iphone11没有口罩解锁)

    为什么iphone11没有查找我的iphone(为什么iphone11没有口罩解锁)

  • 电脑上什么都没有了怎么回事(电脑上啥也没有咋办)

    电脑上什么都没有了怎么回事(电脑上啥也没有咋办)

  • miaisoundbox是啥(miaisoundbox-lx06是什么)

    miaisoundbox是啥(miaisoundbox-lx06是什么)

  • 手机已激活是什么意思(手机已经激活是什么意思)

    手机已激活是什么意思(手机已经激活是什么意思)

  • 修改未知应用权限在哪里(未知应用修改权限之后还是无法下载)

    修改未知应用权限在哪里(未知应用修改权限之后还是无法下载)

  • 腾讯会员可以登几个手机(腾讯会员可以登两台电脑吗)

    腾讯会员可以登几个手机(腾讯会员可以登两台电脑吗)

  • 绿联的18w快充伤电池吗(绿联充电器18w快充头怎么样)

    绿联的18w快充伤电池吗(绿联充电器18w快充头怎么样)

  • 小米8支持双4g待机吗(小米8支持双电信吗?)

    小米8支持双4g待机吗(小米8支持双电信吗?)

  • 手机扫过的二维码能不能找到(手机扫过的二维码能再能找到吗)

    手机扫过的二维码能不能找到(手机扫过的二维码能再能找到吗)

  • 快速关闭talkback方法(快速关闭电脑屏幕的快捷键)

    快速关闭talkback方法(快速关闭电脑屏幕的快捷键)

  • 苹果11怎么拍照(苹果11怎么拍照显示拍摄时间)

    苹果11怎么拍照(苹果11怎么拍照显示拍摄时间)

  • 小米电子秤怎么校正(小米电子秤怎么删除绑定的人)

    小米电子秤怎么校正(小米电子秤怎么删除绑定的人)

  • 抖音作品置顶什么意思(抖音作品置顶会不会更容易火)

    抖音作品置顶什么意思(抖音作品置顶会不会更容易火)

  • p30是50倍变焦吗(p30pro支持50倍变焦)

    p30是50倍变焦吗(p30pro支持50倍变焦)

  • 若依 vue前端 动态设置路由path不同参数 在页面容器里打开新页面(新路由),面包屑和标签页标题根据参数动态改变,面包屑多级标题,侧边栏对应菜单亮起(前端vue后端node)

    若依 vue前端 动态设置路由path不同参数 在页面容器里打开新页面(新路由),面包屑和标签页标题根据参数动态改变,面包屑多级标题,侧边栏对应菜单亮起(前端vue后端node)

  • 如何在UNI-APP内开发微信公众号(H5)JSSDK(uni app怎么样)

    如何在UNI-APP内开发微信公众号(H5)JSSDK(uni app怎么样)

  • python如何删除字符串的特殊字符(python如何删除字典中的键值对)

    python如何删除字符串的特殊字符(python如何删除字典中的键值对)

  • 营业税金及附加包括哪些
  • 车船税规定怎么缴纳
  • 企业的其他业务收入包括哪些
  • 印花税需要计提吗?怎么做会计分录
  • 小型微利企业所得税率
  • 减免的养老保险怎么走账
  • 多交企业所得税可以放弃退税吗
  • 服务发票是增值税发票吗
  • 咨询服务费的印花税率
  • 房产过户需要交个人所得税吗
  • 取得成本发票
  • 将自产的产品用于对外投资
  • 企业注销合适还是转让出去合适
  • 已经使用的固定资产其变动方式等基础资料将
  • 交通补贴可以抵扣个税吗
  • 建筑业企业所得税2%
  • 增值税17%和13%有什么区别
  • 个人所得税是次月申报上月的吗怎么填
  • 航天信息300元是什么费用
  • 商标是按年交费的吗
  • 撤销实收资本会怎么样
  • 公司购买物品流程
  • 向境外企业转让房产
  • 分支机构增值税汇总纳税如何申报?
  • 什么叫保理支付
  • 2021年个人社保代扣失败
  • 2019年固态硬盘价格
  • 应付职工薪酬年底怎么结转
  • 用于非应税项目的购进货物或应税劳务
  • prevsrv.exe - prevsrv是什么进程 有什么用
  • award bios设置详解
  • set up 和establish的区别
  • 金融负债的范围
  • 收购农产品进项税抵扣税率是多少
  • 集团公司收到的上级秘密
  • 圣三一教堂英文
  • 公司注销未分配利润会计分录
  • 浏览器同源策略限制
  • 大前端2021
  • mktemp命令
  • apache trace
  • 出口退税后发生退货怎么处理
  • 建筑企业总包单位有哪些
  • 事业收入如何确认
  • 对账小技巧
  • mysql误删数据
  • 小规模销售免税产品需要交税吗
  • 进口贴息资金
  • 印花税申报成功未扣款还能更正吗
  • 为什么当月增加的无形资产当月摊销
  • 个税滞纳金怎么计算
  • 债券溢价摊销有什么影响
  • 某个项目投资多少钱怎么算
  • 实收资本增加印花税税目怎么填
  • 餐饮发票如何入账
  • 一般纳税人的进项税额可以抵扣吗
  • 无形资产减值准备借贷
  • 跨年度退货可以不退款吗
  • 建筑发票可以一次性抵扣吗
  • 无形资产摊销如何记账
  • 银行对账单和回单有什么区别
  • sqlserver锁机制
  • sql语句的执行方式
  • win7 64位运行软件提示MSCOMCTL.OCX丢失或无效该怎么办?
  • 完整版的苏若雪和沈浪
  • autorun.inf在win10
  • JavaScript数组添加元素
  • 何为黄金茶
  • window.open打开窗口设置背景色
  • linux常用shell命令
  • data命令
  • python爬虫视频教程
  • 安卓底层重写
  • 记录我的生活日常
  • jquery课程内容总结
  • 党建服务中心属于哪个区
  • 工业生产和农业生产区别
  • 印花税为什么不计入资产成本
  • 企业税务登记是什么证件
  • 沭阳税务局举报电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设