Jackson ObjectMapper 使用教程

2024-05-03 22:18

本文主要是介绍Jackson ObjectMapper 使用教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

添加 依赖

gradle

    implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml")

maven

    <dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId><version>2.8.2</version></dependency>

配置 ObjectMapper

    /*** Jackson config* @return 自定义 {@link com.fasterxml.jackson.databind.ObjectMapper} 配置*/@Beanpublic Jackson2ObjectMapperBuilderCustomizer objectMapperBuilderCustomizer() {return builder -> {// 序列化时字段值为 null 时不输出builder.serializationInclusion(JsonInclude.Include.NON_NULL);// 序列化时按照字幕顺序输出(降低点性能,但是关键时刻方便进行字段对比)builder.featuresToEnable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY);// 有不匹配的字段是否抛出异常builder.featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);// 接受单个字符的值反序列化为数组。builder.featuresToEnable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);// 配置 时间序列化builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));builder.serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));builder.serializerByType(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));builder.serializerByType(Date.class, new DateSerializer(false, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")));builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));builder.deserializerByType(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));builder.deserializerByType(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));builder.deserializerByType(Date.class, new DateDeserializers.DateDeserializer(DateDeserializers.DateDeserializer.instance, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), "yyyy-MM-dd HH:mm:ss"));};}

Jackson 的注解使用

序列化生效 实体转为json
反序列化生效 json转为实体类

序列化生效@JsonProperty("名字key")
public String name;   //{"名字key":"张三"}@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy/MM/dd HH:mm:ss", locale = "zh", timezone = "GMT+8")
private Date profileCreateTime;  //{"profileCreateTime":"2018/12/7 12:30:00"}反序列化生效@JsonInclude(JsonInclude.Include.NON_EMPTY)
public static class aBean {}
// 放在类名上面 则对此类全部属性起作用 序列化或往页面传值时起作用
JsonInclude.Include.ALWAYS 默认不生效					序列化
JsonInclude.Include.NON_NULL 属性为NULL				不序列化
JsonInclude.Include.NON_ABSENT 属性为空字符串			不序列化
JsonInclude.Include.NON_EMPTY 属性为空字符串 或 NULL	不序列化
JsonInclude.Include.NON_DEFAULT 属性为默认值时			不序列化
JsonInclude.Include.CUSTOM 指定自定义筛选器			不序列化
JsonInclude.Include.USE_DEFAULTS 使用类或对象的默认值	序列化//自定义 序列化  处理 
@JsonSerialize(using = Data2LongSerizlizer.class )
public class Data2LongSerizlizer extends JsonSerializer<Date> {
@Override
/** 该类可以将日期13位时间戳转换成10位时间戳的long类型 */
}//反序列化期间接受的属性定义一个或多个替代名称, 序列化时候还是取 userName
@JsonAlias({"aName", "bName"})
private String userName;

ObjectMapper 的简单使用

@Resource
private ObjectMapper objectMapper;Person person = new Person();
entity 转 string json 如果有@JsonSerialize("") ,key 就取的是这个的值
```java
String personString =objectMapper.writeValueAsString(person));
string json [{“a”:2},{“a”:4}] 转 list
List<Person> plist = objectMapper.readValue(personString , new TypeReference<List<.Person>>(){});
string json {“a”:2} 转 entity
Person  p= objectMapper.readValue(personString , Person.class);
string json {“a”:2} 转 Map
TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() {};
HashMap<String, Object> o = objectMapper.readValue(value, typeRef);
更新对象的值 将personString 值 覆盖部分有的属性. entity
ObjectReader objectReader = objectMapper.readerForUpdating(person);
Person updatedPerson = objectReader.readValue(personString);
entity 转 jsonObject 如果有@JsonSerialize("") ,key 就取的是这个的值
objectMapper.convertValue(personString, JSONObject.class);
string json 转 person Node
JsonNode actualObj = objectMapper.readTree(personString);
@JsonRawValue 防止添加多余的内容\r\n 转换成原始对象
in
{ "name" : "Mark", "rollNo" : 1, "json" : {\"attr\":false} 
} @JsonRawValue  private String json;out
{ "name" : "Mark", "rollNo" : 1, "json" : {"attr":false} 
}
例子 ,数据库存的 jons 字符串 页面想返回 对象
//因为全局 配置 ,所以要先判断下是否为 字符串
public class StringSerializer extends JsonSerializer<String> {@Resourceprivate ObjectMapper objectMapper;@Overridepublic void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {boolean flag = false;if (StringUtils.isNotBlank(value)) {value = value.trim();if (value.startsWith("{") && value.endsWith("}")) {flag = true;}if (value.startsWith("[") && value.endsWith("]")) {flag = true;}if (value.startsWith("[{") && value.endsWith("}]")) {flag = true;}}if (flag) {try {objectMapper.readTree(value);flag = true;} catch (Exception e) {flag = false;}if (flag) {TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() {};HashMap<String, Object> o = objectMapper.readValue(value, typeRef);gen.writeObject(o);}}gen.writeString(value);}
}

全局配置

	@Beanpublic MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();objectMapper.configure(DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY, true);objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));SimpleModule simpleModule = new SimpleModule();
//		simpleModule.addDeserializer(String.class, new StringDeserializer());simpleModule.addSerializer(String.class, new StringSerializer());objectMapper.registerModule(simpleModule);jsonConverter.setObjectMapper(objectMapper);return jsonConverter;}
复杂对象json 转换 (泛型)
例子 jsonSting  to  ObjectEntityjson = "{"code": 0,"msg": null,"obj": {"current": 1,"hitCount": false,"optimizeCountSql": true,"orders": [],"pages": 1,"records": [{"address": "海南省三亚市海棠区","deviceId": "8880139","deviceName": "海南省三亚市海棠区微心测试","hospitalId": 12,"hospitalName": "测试专用医院","id": 896,"lat": 18.34801783549779,"lng": 109.71318002841308,"status": 1,"updateTime": 1602228247000},{"address": "北站","deviceId": "80801108","deviceName": "测试设备1","hospitalId": 12,"hospitalName": "测试专用医院","id": 895,"lat": 30.21715956845446,"lng": 115.01468563671428,"status": 1,"updateTime": 1601374004000}],"searchCount": true,"size": 500,"total": 11}}";JavaType javaType1 = objectMapper.getTypeFactory().constructParametricType(Page.class, DeviceEntity.class);JavaType javaTyp = objectMapper.getTypeFactory().constructParametricType(JsonResult.class,javaType1);TypeReference<JsonResult<Page<DeviceEntity>>> typeReference = new TypeReference<JsonResult<Page<DeviceEntity>>>() {};//通过 javaType 转换JsonResult<Page<DeviceEntity>> page1 = objectMapper.readValue(json,javaTyp);// 通过 TypeReference 来转换JsonResult<Page<DeviceEntity>> page2 = objectMapper.readValue(json,typeReference);public class JsonResult<T> implements Serializable {private static final long serialVersionUID = 7982365785632121536L;private int code;private T obj;private String msg;}public class Page<T> implements IPage<T> {private static final long serialVersionUID = 8545996863226528798L;/*** 查询数据列表*/private List<T> records = Collections.emptyList();/*** 总数*/private long total = 0;/*** 每页显示条数,默认 10*/private long size = 10;/*** 当前页*/private long current = 1;/*** 排序字段信息*/private List<OrderItem> orders = new ArrayList<>();/*** 自动优化 COUNT SQL*/private boolean optimizeCountSql = true;/*** 是否进行 count 查询*/private boolean isSearchCount = true;}@Datapublic class DeviceEntity implements Serializable {@ApiModelProperty(value = "ID")@JsonProperty("id")Integer id;@ApiModelProperty(value = "设备ID")@JsonProperty("deviceId")String deviceId;@ApiModelProperty(value = "设备名称")@JsonProperty("deviceName")String deviceName;@ApiModelProperty(value = "设备地址")@JsonProperty("address")String address;@ApiModelProperty(value = "设备管理员名称")@JsonProperty("manager")String manager;@ApiModelProperty(value = "设备管理员电话")@JsonProperty("phone")String phone;@ApiModelProperty(value = "所属医院Id")@JsonProperty("hospitalId")Integer hospitalId;@ApiModelProperty(value = "所属医院名称")@JsonProperty("hospitalName")String hospitalName;@ApiModelProperty(value = "是否有效")@JsonProperty("status")Integer status;@ApiModelProperty(value = "新增或更新时间")@JsonProperty("updateTime")Date updateTime;@ApiModelProperty(value = "纬度值")@JsonProperty("lat")Double lat;@ApiModelProperty(value = "经度值")@JsonProperty("lng")Double lng;}

这篇关于Jackson ObjectMapper 使用教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/957771

相关文章

mybatis-plus QueryWrapper中or,and的使用及说明

《mybatis-plusQueryWrapper中or,and的使用及说明》使用MyBatisPlusQueryWrapper时,因同时添加角色权限固定条件和多字段模糊查询导致数据异常展示,排查发... 目录QueryWrapper中or,and使用列表中还要同时模糊查询多个字段经过排查这就导致只要whe

Python使用openpyxl读取Excel的操作详解

《Python使用openpyxl读取Excel的操作详解》本文介绍了使用Python的openpyxl库进行Excel文件的创建、读写、数据操作、工作簿与工作表管理,包括创建工作簿、加载工作簿、操作... 目录1 概述1.1 图示1.2 安装第三方库2 工作簿 workbook2.1 创建:Workboo

使用Go实现文件复制的完整流程

《使用Go实现文件复制的完整流程》本案例将实现一个实用的文件操作工具:将一个文件的内容完整复制到另一个文件中,这是文件处理中的常见任务,比如配置文件备份、日志迁移、用户上传文件转存等,文中通过代码示例... 目录案例说明涉及China编程知识点示例代码代码解析示例运行练习扩展小结案例说明我们将通过标准库 os

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

Python 字典 (Dictionary)使用详解

《Python字典(Dictionary)使用详解》字典是python中最重要,最常用的数据结构之一,它提供了高效的键值对存储和查找能力,:本文主要介绍Python字典(Dictionary)... 目录字典1.基本特性2.创建字典3.访问元素4.修改字典5.删除元素6.字典遍历7.字典的高级特性默认字典

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断