参考:
https://www.cnblogs.com/whyblogs/p/15062486.html

Jackson,我感觉是在Java与Json之间相互转换的最快速的框架,当然Google的Gson也很不错,但是参照网上有人的性能测试,看起来还是Jackson比较快一点

Jackson处理一般的JavaBean和Json之间的转换只要使用ObjectMapper 对象的readValue和writeValueAsString两个方法就能实现。但是如果要转换复杂类型Collection如 List,那么就需要先反序列化复杂类型 为泛型的Collection Type。

例子1

如果是HashMap<String,YourBean>那么 ObjectMapper 的

getTypeFactory().constructParametricType(HashMap.class,String.class, YourBean.class);public final ObjectMapper mapper = new ObjectMapper();public static void main(String[] args) throws Exception{JavaType javaType = getCollectionType(ArrayList.class, YourBean.class);List<YourBean> lst =  (List<YourBean>)mapper.readValue(jsonString, javaType);}/*** 获取泛型的Collection Type* @param collectionClass 泛型的Collection* @param elementClasses 元素类* @return JavaType Java类型* @since 1.0*/public static JavaType getCollectionType(Class<?> collectionClass, Class<?>... elementClasses) {return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);}

例子2

要转换的实体类

package cn.org.emcs.common.vo;import cn.org.emcs.common.gogoenum.ResultCodeEnum;
import lombok.Data;
import lombok.experimental.Accessors;@Data
@Accessors(chain = true)
public class Res<T> {private Integer code;private String msg;private T data;public Res(){}public Res(ResultCodeEnum resultCode, T data) {this.code = resultCode.getCode();this.msg = resultCode.getMsg();this.data = data;}public Res(Integer code,String msg, T data){this.code = code;this.msg = msg;this.data = data;}public Res(Integer code, T data,String msg) {this.code = code;this.msg = msg;this.data = data;}public static <T> Res<T> success() {Res<T> res = new Res<>();res.setResultCode(ResultCodeEnum.SUCCESS);return res;}public static <T> Res<T> success(T data) {Res<T> res = new Res<>();res.setResultCode(ResultCodeEnum.SUCCESS);res.setData(data);return res;}public static <T> Res<T> success(Integer code,String msg){Res<T> res = new Res<>();res.setCode(code);res.setMsg(msg);return res;}public static <T> Res<T> fail() {Res<T> res = new Res<>();res.setResultCode(ResultCodeEnum.FAIL);return res;}public static <T> Res<T> fail(ResultCodeEnum resultCode) {Res<T> res = new Res<>();res.setResultCode(resultCode);return res;}public static <T> Res<T> fail(Integer code,String msg){Res<T> res = new Res<>();res.setCode(code);res.setMsg(msg);return res;}public static <T> Res<T> fail(ResultCodeEnum resultCode, T data) {Res<T> res = new Res<>();res.setResultCode(resultCode);res.setData(data);return res;}public static <T> Res<T> fail(T data) {Res<T> res = new Res<>();res.setResultCode(ResultCodeEnum.FAIL);res.setData(data);return res;}public void setResultCode(ResultCodeEnum resultCode) {this.code = resultCode.getCode();this.msg = resultCode.getMsg();}
}

自定义feign的解码

package cn.org.emcs.common.config.feign.decoder;import cn.org.emcs.common.utils.JsonUtil;
import cn.org.emcs.common.vo.Res;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import feign.FeignException;
import feign.Response;
import feign.Util;
import feign.codec.DecodeException;
import feign.codec.Decoder;
import lombok.extern.slf4j.Slf4j;import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;@Slf4j
public class FeignResDecoder implements Decoder {private static final ObjectMapper objectMapper = new ObjectMapper();static {objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);// 允许出现特殊字符和转义符objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);// 允许出现单引号objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);}@Overridepublic Object decode(Response response, Type type) throws IOException, FeignException {if (response.body() == null) {throw new DecodeException(response.status(), "没有返回有效的数据", response.request());}String bodyStr = Util.toString(response.body().asReader(Util.UTF_8));//第一种情况,如果为Responseif (type instanceof cn.org.emcs.common.vo.Response || Map.class.equals(type)){return JsonUtil.json2obj(bodyStr,type);}//第二种情况,如果有类型,如Res<UserInfo>,或者List<Permission>if (type instanceof ParameterizedType) {Type rawType = ((ParameterizedType) type).getRawType();//如果为如Res<UserInfo>if (Res.class.equals(rawType)) {return JsonUtil.json2obj(bodyStr, type);//或者List<Permission>}Res res = JsonUtil.json2obj(bodyStr, Res.class);return JsonUtil.json2obj(objectMapper.writeValueAsString(res.getData()), type);} else {//另一种情况//如下可以,但是不完美,Result<T>类可能是Res<T>类,也可能是Response<T>Res res = JsonUtil.json2obj(bodyStr, Res.class);return JsonUtil.json2obj(objectMapper.writeValueAsString(res.getData()), type);}}}
public static <T> T json2obj(String jsonStr, Type targetType) {try {JavaType javaType = TypeFactory.defaultInstance().constructType(targetType);return objectMapper.readValue(jsonStr, javaType);} catch (IOException e) {throw new IllegalArgumentException("将JSON转换为对象时发生错误:" + jsonStr, e);}}

Jackson 数据类型转换(使用JavaType)相关推荐

  1. 数据类型转换pytorch

    du = torch.ones([2,2]) a = np.array([[1,2],[3,4]],dtype=np.float32) b = torch.from_numpy(a)#数据类型是不变的 ...

  2. tf.cast()数据类型转换

    tf.cast()函数的作用是执行 tensorflow 中张量数据类型转换,比如读入的图片如果是int8类型的,一般在要在训练前把图像的数据格式转换为float32. cast定义: cast(x, ...

  3. Java中如何实现Date与String之间的数据类型转换

    String 数据类型转换成 Date String inputDate = "2021-04-11";Date outputDate = null;SimpleDateForma ...

  4. Java 数据类型转换

    学而时习之,温故而知新. 数据类型转换,先放一张图,了解数据类型 简单数据类型之间的转换又可以分为: 1 低级到高级的自动类型转换 2 级到低级的强制类型转换 3 包装类过渡类型转换. (有时候我们有 ...

  5. Java基础语法(一)注释,关键字,常量,变量,数据类型,标识符,数据类型转换...

    从今天开始,记录学习Java的过程.要学习Java首先得有环境,至于环境的安装我就不说了,百度有很多教程,比如:http://jingyan.baidu.com/article/20095761904 ...

  6. C/C++各种数据类型转换汇总

    以下是Windows/Linux系统中常用的C/C++各种数据类型转换汇总: #ifndef FBC_MESSY_TEST_DATA_TYPE_CONVERT_HPP_ #define FBC_MES ...

  7. Java类Demo中存在_Java中的数据类型转换

    先来看一个题: Java类Demo中存在方法func0.func1.func2.func3和func4,请问该方法中,哪些是不合法的定义?( ) public class Demo{ float fu ...

  8. Php的if自动转换类型,php之数据类型自动转换,php之数据类型转换_PHP教程

    php之数据类型自动转换,php之数据类型转换 1:概述 ---php是一种弱类型的语言,它可以根据运行环境的变化而自动进行数据类型的转换 1.1转换成布尔类型的原则 以下值都将转换成布尔类型中的fa ...

  9. python数字类型转换函数_Python的数据类型转换函数

    玩蛇网这篇文章给大家介绍关于,Python数据类型的转换函数. Python提供了一些可以把某个值从一种数据类型,转换成为另一种数据类型的内置函数和方法.int函数可以将任何可以转换为整型的值转换为整 ...

最新文章

  1. flink state ttl
  2. php mysql 链表_php实现数据结构的单向链表
  3. python实战——发邮件
  4. Dell Latitude D630 无法wubi安装Kubuntu
  5. 动手组装深度学习机器+RTX2070Super
  6. springboot添加拦截器 监听等设置
  7. 2019夏软工暑期随笔3
  8. 动态添加html示例
  9. CentOS8下安装配置Wireguard
  10. VBScript: 正则表达式(RegExp对象)
  11. webstorm主题设置
  12. BCB6使用ReportMachine创建报表
  13. android 极简浏览器,盘点最干净简洁的手机浏览器,到底哪个最好用?
  14. Mac安装Node-sass报错 warning: loop variable ‘numerator‘ creates a copy from type ‘const std::string
  15. 计算机视觉物体识别的过程,(物体识别过程.doc
  16. 都2021年了,你还在考虑电赛飞行器赛题,备赛是否有必要用基于TI处理芯片的飞控问题?
  17. Matplotlib官方文档学习笔记 PART1-简介 C2-pyplot教程 (19-12-4 by-xieyuxin)
  18. ios App支付宝开放平台申请支付宝支付具体步骤
  19. 简单的激光干涉测距仪原理——为什么只能测量相对距离
  20. 基于matlab语音增强,基于MATLAB的语音增强系统的设计

热门文章

  1. 2014.10.9——Jim Foley教授讲座How real is real enough?
  2. 三菱MR-JE-C伺服电机FB功能块(适用Q系列PLC) 流水线项目,16个MR-JE-C电机,为了加快编程速度,特意做的一个FB功能块
  3. 如何从无到有做一个好关卡?
  4. ups不间断电源品牌_德国阳光蓄电池_蓄电池代理-山东万仁电源设备有限公司
  5. FIFA 世界杯 2022 电视直播观战私家指南
  6. python马尔可夫链_[译] 用 Python 实现马尔可夫链的初级教程
  7. (2022)Epic添加本地游戏
  8. 就业感言:纸上得来终觉浅,绝知此事要躬行
  9. PHP Warning: file_put_contents(..):failed to open stream: Permission denied in...
  10. PilotPi:树莓派运行PX4配置方法