Jackson 学习使用

文章目录

  • Jackson 学习使用
    • Jackson 优点
    • Jackson 的核心模块
      • 引入 Jackson 依赖
    • 多态类型的序列化及反序列化
      • @JsonTypeInfo
    • ObjectMapper可设置的属性
    • JackSonUtils
    • JackSon常用注解
  • Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。Jackson所依赖的jar包较少,简单易用并且性能也要相对高些,并且Jackson社区相对比较活跃,更新速度也比较快。

Jackson 优点

  • 解析大文件的速度比较快;
  • 运行时占用的内存比较少,性能更佳;
  • API 很灵活,容易进行扩展和定制

Jackson 的核心模块

  • jackson-core:核心包,提供基于“流模式”解析的相关 API,包括 JsonPaserJsonGenerator
  • jackson-annotations:注解包,提供标准的注解功能;
  • jackson-databind :数据绑定包,提供基于“对象绑定”解析的相关 API 和基于“树模型”解析的相关 API

引入 Jackson 依赖

要想使用 Jackson,需要在 pom.xml 文件中添加 Jackson 的依赖。

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.10.1</version>
</dependency>

jackson-databind 依赖于 jackson-core 和 ~,所以添加完 jackson-databind 之后,Maven 会自动将 jackson-corejackson-annotations 引入到项目当中。

多态类型的序列化及反序列化

  • 要对json对象进行反序列化操作,但是我们并不知知道具体的json格式,也就是说我们不知道json有哪些字段。

  • 解析抽象类或者接口

@JsonTypeInfo

  • Animal抽象类:使用 JsonTypeInfo注解配置反序列化的规则
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,property = "name",visible = true,include = JsonTypeInfo.As.EXISTING_PROPERTY)
@JsonSubTypes({@JsonSubTypes.Type(value = Dog.class, name = "dog"),@JsonSubTypes.Type(value = Cat.class, name = "cat")
})
public abstract class Animal {private String name;private String id;// getset
}
  • Cat子类
public class Cat extends Animal{private String speed;}
  • Dog子类
public class Dog extends Animal{private String food;}
  • 测试类
@Test
public void test1() {String tempStr = "{\"speed\":\"100\",\"name\":\"cat\",\"food\":\"dogfood\"}";ObjectMapper mapper = new ObjectMapper();// 配置忽略未知属性mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);try {Dog dog = (Dog) mapper.readValue(tempStr, Animal.class);logger.info("cat:{} ", dog.toString());} catch (IOException e) {throw new RuntimeException(e);}
}

ObjectMapper可设置的属性

ObjectMapper objectMapper = new ObjectMapper();
// 属性为Null的不进行序列化,只对pojo起作用,对map和list不起作用
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
// json进行换行缩进等操作
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
// json不进行换行缩进等操作  默认就是不进行操作,写了这行和没写的效果一样
objectMapper.disable(SerializationFeature.INDENT_OUTPUT);
// json是否允许属性名没有引号 ,默认是false
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
//json是否允许属性名为单引号 ,默认是false
objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
// 遇到未知属性是否抛出异常 ,默认是抛出异常的
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// 当实体类没有setter方法时,序列化不报错,返回一个空对象
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
// 所有的字母小写,没有分隔符,例如 lowercase
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE);
//序列化的时候序列对象的所有属性
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
//取消时间的转化格式,默认是时间戳,可以取消,同时需要设置要表现的时间格式
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
// 设置日期格式化
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

JackSonUtils

public class JackSonUtils {private static Logger logger = LoggerFactory.getLogger(JackSonUtils.class);private static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";private static final ConcurrentHashMap<String, ObjectMapper> mapperMap = new ConcurrentHashMap<>();/*** 对象转json字符串** @param object object* @return String*/public static String toJSONString(Object object) {return toJSONString(object, YYYY_MM_DD_HH_MM_SS, false);}/*** 对象转json字符串, 是否美化输出** @param object       object* @param prettyFormat 是否美化输出* @return String*/public static String toJSONString(Object object, boolean prettyFormat) {return toJSONString(object, YYYY_MM_DD_HH_MM_SS, prettyFormat);}/*** 对象转json字符串,指定日期格式** @param object           object* @param dataFormatString 时间格式化* @return String*/public static String toJSONString(Object object, String dataFormatString) {return toJSONString(object, dataFormatString, false);}/*** 对象转json字符串,指定日期格式, 是否美化输出** @param object           object* @param dataFormatString 时间格式化* @param prettyFormat     是否美化格式* @return String*/public static String toJSONString(Object object, String dataFormatString, boolean prettyFormat) {return toJSONString(object, dataFormatString, prettyFormat, JsonInclude.Include.NON_NULL);}/*** 对象转json字符串,空值处理*/public static String toJSONString(Object object, JsonInclude.Include include) {return toJSONString(object, YYYY_MM_DD_HH_MM_SS, false, include);}/*** 对象转json字符串,指定日期格式, 空值处理*/public static String toJSONString(Object object, String dataFormatString, JsonInclude.Include include) {return toJSONString(object, dataFormatString, false, include);}/*** 对象转json字符串,指定日期格式, 是否美化输出, 空值处理** @param object           object* @param dataFormatString 时间日期格式化* @param prettyFormat     是否美化输出* @param include          include* @return String*/public static String toJSONString(Object object, String dataFormatString, boolean prettyFormat, JsonInclude.Include include) {if (ObjectUtils.isEmpty(object)) {return null;}if (!StringUtils.hasText(dataFormatString)) {dataFormatString = YYYY_MM_DD_HH_MM_SS;}ObjectMapper objectMapper = getObjectMapper(dataFormatString, prettyFormat, include);try {return objectMapper.writeValueAsString(object);} catch (JsonProcessingException e) {logger.error(e.getMessage(), e);}return null;}/*** 将json字符串转换成ObjectNode对象** @param content content*/public static ObjectNode parseObject(String content) {return parseObject(content, ObjectNode.class);}/*** 将json字符串转换成指定类型对象** @param <T>     T* @param content 内容*/public static <T> T parseObject(String content, Class<T> valueType) {if (!StringUtils.hasText(content)) {return null;}ObjectMapper objectMapper = getObjectMapper();try {return objectMapper.readValue(content, valueType);} catch (Exception e) {logger.error(e.getMessage(), e);}return null;}/*** 将json字符串转换成ArrayNode数组*/public static ArrayNode parseArray(String content) {return parseObject(content, ArrayNode.class);}/*** 将json字符串转换成指定类型对象数组*/public static <T> List<T> parseArray(String content, Class<T> valueType) {if (!StringUtils.hasText(content)) {return null;}ObjectMapper objectMapper = getObjectMapper();try {CollectionType javaType = objectMapper.getTypeFactory().constructCollectionType(List.class, valueType);return objectMapper.readValue(content, javaType);} catch (Exception e) {logger.error(e.getMessage(), e);}return null;}/*** 将json字符串转换成Map** @param content c* @param content*/public static Map<String, Object> parseMap(String content) {return parseMap(content, String.class, Object.class);}/*** 将json字符串转换成Map, 指定泛型*/public static <K, V> Map<K, V> parseMap(String content, Class<K> keyType, Class<V> valueType) {if (!StringUtils.hasText(content)) {return null;}ObjectMapper objectMapper = getObjectMapper();try {MapType javaType = objectMapper.getTypeFactory().constructMapType(Map.class, keyType, valueType);return objectMapper.readValue(content, javaType);} catch (Exception e) {logger.error(e.getMessage(), e);}return null;}/*** 将json字符串转换成Map数组** @param content content* @return List*/public static List<Map<String, Object>> parseMapArray(String content) {return parseMapArray(content, String.class, Object.class);}/*** 将json字符串转换成Map数组, 指定泛型*/public static <K, V> List<Map<K, V>> parseMapArray(String content, Class<K> keyType, Class<V> valueType) {if (!StringUtils.hasText(content)) {return null;}ObjectMapper objectMapper = getObjectMapper();try {TypeFactory typeFactory = objectMapper.getTypeFactory();MapType mapType = typeFactory.constructMapType(Map.class, keyType, valueType);CollectionType collectionType = objectMapper.getTypeFactory().constructCollectionType(List.class, mapType);return objectMapper.readValue(content, collectionType);} catch (JsonMappingException e) {logger.error("JsonMappingException: ", e);} catch (JsonProcessingException e) {logger.error("JsonProcessingException: ", e);}return null;}/*** 获取 ObjectMapper** @return ObjectMapper*/private static ObjectMapper getObjectMapper() {return getObjectMapper(YYYY_MM_DD_HH_MM_SS, false, JsonInclude.Include.NON_NULL);}/*** 获取 ObjectMapper** @param dataFormatString 时间格式化格式* @param prettyFormat     是否美化输出* @param include          include* @return ObjectMapper*/private static ObjectMapper getObjectMapper(String dataFormatString, boolean prettyFormat, JsonInclude.Include include) {String key = prettyFormat ? "P#" + dataFormatString : dataFormatString;ObjectMapper objectMapper = mapperMap.get(key);if (objectMapper != null) {return objectMapper;}mapperMap.putIfAbsent(key, new ObjectMapper());objectMapper = mapperMap.get(key);objectMapper.setSerializationInclusion(include);// 忽略未知映射objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);// 日期格式objectMapper.setDateFormat(new SimpleDateFormat(dataFormatString));// 美化输出if (prettyFormat) {objectMapper.enable(SerializationFeature.INDENT_OUTPUT);}// 处理 BigDecimal 精度问题SimpleModule module = new SimpleModule();module.addSerializer(BigDecimal.class, new BigDecimalJsonSerializer());// 处理 Double 科学计数法module.addSerializer(Double.class, new DoubleJsonSerializer());objectMapper.registerModule(module);return objectMapper;}/*** BigDecimal 类型的序列设置*/private static class BigDecimalJsonSerializer extends JsonSerializer<BigDecimal> {public void serialize(BigDecimal t, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {if (null == t) {jsonGenerator.writeNull();} else {String valStr = t.toPlainString();if (valStr.length() > 16) {jsonGenerator.writeString(valStr);} else {jsonGenerator.writeNumber(t);}}}}/*** Double 类型的序列化设置*/private static class DoubleJsonSerializer extends JsonSerializer<Double> {public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers) throws IOException {if (value == null) {gen.writeNull();} else {String valStr = value.toString();if (valStr.contains("E")) {gen.writeString(new BigDecimal(valStr).toPlainString());} else {gen.writeNumber(value.doubleValue());}}}}
}

JackSon常用注解

注解 用法
@JsonProperty 用于属性,把属性的名称序列化时转换为另外一个名称。示例: @JsonProperty("birthDateTime") private Date birthDate;
@JsonFormat 用于属性或者方法,把属性的格式序列化时转换成指定的格式。示例: @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm") public Date getBirthDate()
  • @JsonIgnore:序列化时忽略此字段
  • @JsonIgnorePropertiesJackson注解用于指定要忽略的类的属性列表。 @JsonIgnoreProperties注解放置在类声明上方,而不是要忽略的各个属性(字段)上方。

# Jackson 学习使用相关推荐

  1. jackson学习之五:JsonInclude注解

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章汇总 jackson学习之一:基本信息 jac ...

  2. jackson学习之一:基本信息

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 系列文章汇总 jackson学习之一:基本信息 jac ...

  3. Jackson学习笔记

    Java下常见的Json类库有Gson.JSON-lib和Jackson等,Jackson相对来说比较高效,在项目中主要使用Jackson进行JSON和Java对象转换,下面给出一些Jackson的J ...

  4. Jackson 学习

    概述 Jackson框架是基于Java平台的一套数据处理工具,被称为"最好的Java Json解析器". Jackson框架包含了3个核心库:streaming,databind, ...

  5. jackson学习之五:JsonInclude注解,颠覆认知

    ALWAYS ALWAYS表示全部序列化,如下图,null和空字符串都会序列化: NON_NULL NON_NULL好理解,就是值为null就不序列化: ![在这里插入图片描述](https://im ...

  6. jackson学习----解析豆瓣的图书信息

    异常一. org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple t ...

  7. Jackson学习笔记(三)转

    概述 使用jackson annotations简化和增强的json解析与生成. Jackson-2.x通用annotations列表:https://github.com/FasterXML/jac ...

  8. Jackson学习二之集合类对象与JSON互相转化--转载

    原文地址:http://lijingshou.iteye.com/blog/2003059 本篇主要演示如何使用Jackson对List, Map和数组与JSON互相转换. package com.j ...

  9. 程序员欣宸的文章分类汇总

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于代码仓库 代码仓库里是博客中涉及的源码和文件,地址 ...

最新文章

  1. Springboot 利用AOP编程实现切面日志
  2. 如何救队友_第五人格中高端局如何救队友,这些技巧很实用,不卡血量是关键...
  3. 删除10亿人脸数据,Meta关闭了Facebook的人脸识别系统
  4. 配合使用自制的PE3.0启动盘和Windows部署服务,实现Ghost网克
  5. Otter-入门篇4(单向同步实践)
  6. js返回顶部和始终保持底部
  7. python-斐波那契数列的计算
  8. 怎样在电脑桌面上显示计算机,怎样在电脑桌面上显示天气 - 卡饭网
  9. 云更新网吧系统服务器,云更新网吧服务器环境要求
  10. 函数计算机怎么算开根号,excel开根号公式怎么计算(详解excel开根号公式函数)...
  11. 大数据经典学习路线以及各阶段所发挥的作用
  12. 关于MP4V2 封装h265 接口调用问题
  13. 花在照顾子女上的时间对父亲自己的大脑具有可塑性?
  14. 2022讯飞——糖尿病遗传风险检测挑战赛解决方案
  15. 工作日志----统一工号补充了啦
  16. 解析今日头条as,cp,_signiture参数---as,cp
  17. 万国数据表现不佳的风险很高
  18. 在javascript中使用纯函数处理副作用
  19. 基于STM32的OLED多级菜单GUI实现(简化版智能手表)
  20. placement new的用法

热门文章

  1. java百度实时人脸检测_Java对接百度智能云人脸识别
  2. 即刻报名|汽车制造行业如何玩转大数据分析?
  3. SpringBoot实现文件上传下载功能详解(附带中文名称显示乱码问题的解决)
  4. android bitmap转图片_带你用Android自定义View实现网易云音乐宇宙尘埃特效
  5. 常用eda软件orcad、ewb、protel和pads对比介绍
  6. HBuilderX uni-app简单实现静态登录页面(实例)
  7. Hitpoint合作伙伴——铂略咨询“营改增”课程苏州举行
  8. 李忠汇编语言-初学-第十一天
  9. leetcode_买股票的最佳时机----Python
  10. numpy.eye()对角线矩阵的一些心得