JsonDeserialize序列化和反序列化(JSON转Java对象,反之)

我是直接用默认的,省事省事省事

    @JsonSerialize // 序列化@JsonDeserialize // 反序列化private List<List<LinkedHashMap<String, Object>>> s;

一、JsonDeserialize注解介绍

JsonDeserialize注解是Jackson库提供的一种注解,用于指定反序列化时使用的自定义反序列化器。作为Jackson库的一部分,JsonDeserialize注解可以在Java对象和JSON数据之间进行转换。

JsonDeserialize注解一般用于反序列化时需要进行特殊处理的情况,比如将一个JSON中的String类型字段解析为Java对象。

二、JsonDeserialize注解使用示例

JsonDeserialize注解可以用于字段、setter方法或构造函数。 


public class Person {@JsonDeserialize(using = CustomDateDeserializer.class)private Date birthDate;
}public class CustomDateDeserializer extends JsonDeserializer<Date> {@Overridepublic Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");String date = jp.getText();try {return format.parse(date);} catch (ParseException e) {throw new RuntimeException(e);}}
}

上面的代码中,使用了JsonDeserialize注解来指定birthDate字段在反序列化时使用CustomDateDeserializer类进行处理。

三、JsonDeserialize注解的属性

JsonDeserialize注解有很多属性可以使用,下面对其中一些常用的属性进行介绍。

1. using

使用using属性指定反序列化器的类。如果不指定,则默认使用Jackson库提供的反序列化器。

@JsonDeserialize(using = CustomDeserializer.class)
public class Person {private String name;private int age;//getters and setters
}
2. contentUsing

使用contentUsing属性指定反序列化器的类,用于集合元素、Map键值对、数组元素等。

@JsonDeserialize(contentUsing = CustomDeserializer.class)
private List<Person> children;
3. keyUsing

使用keyUsing属性指定反序列化器的类,用于Map键的反序列化。

@JsonDeserialize(keyUsing = CustomKeyDeserializer.class)
private Map<Person, String> map;
4. as

使用as属性指定反序列化类型。常用的取值为PROPERTY和VALUE,分别表示将元素的key或value作为反序列化类型。

@JsonDeserialize(as = MyEnum.class)
public class Person {private Map<String, MyEnum> properties;//getters and setters
}

四、JsonDeserialize注解的实践应用场景

1. Map转String

在实际开发中,经常会遇到需要将Map对象转换为String类型的情况。使用JsonDeserialize注解可以方便地实现这一功能。

public class MyObject {@JsonDeserialize(using = MapToStringDeserializer.class)private Map<String, String> data;
}public class MapToStringDeserializer extends JsonDeserializer<String> {@Overridepublic String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {Map<String, String> map = p.readValueAs(Map.class);StringBuilder sb = new StringBuilder();for (Map.Entry<String, String> entry : map.entrySet()) { if (sb.length() > 0) {sb.append("&");}sb.append(URLEncoder.encode(entry.getKey(), "UTF-8"));sb.append("=");sb.append(URLEncoder.encode(entry.getValue(), "UTF-8"));}return sb.toString();}
}

上面的代码中,定义了一个MyObject类,其中的data字段使用了MapToStringDeserializer类进行反序列化。

2. 处理特殊字段类型

有时候,JSON中的字段类型与Java对象中的类型不完全一致,这时就需要使用JsonDeserialize注解进行特殊处理。

public class Product {private String id;@JsonDeserialize(using = MonetaryAmountDeserializer.class)private MonetaryAmount price;//getters and setters
}public class MonetaryAmount {private String currency;private BigDecimal value;//getters and setters
}public class MonetaryAmountDeserializer extends JsonDeserializer<MonetaryAmount> {@Overridepublic MonetaryAmount deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {ObjectCodec codec = p.getCodec();JsonNode node = codec.readTree(p);String currency = node.get("currency").asText();BigDecimal value = node.get("value").decimalValue();return new MonetaryAmount(currency, value);}
}

上面的代码中,定义了一个Product类,其中的price字段类型为MonetaryAmount,在反序列化时,使用了MonetaryAmountDeserializer类进行处理。

五、总结

通过本文的介绍,我们可以了解到JsonDeserialize注解的作用,以及如何使用该注解来实现不同的反序列化需求。在实际开发中,使用该注解可以大大简化代码量,提高开发效率。

地址:详解JsonDeserialize注解_笔记大全_设计学院

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React18 入门与进阶

React18 入门与进阶 前言一、核心概念与类组件使用1、虚拟DOM与新的渲染写法2、JSX 与 JSX 的使用3、类组件和函数组件4、类组件与类组件通信5、props详解与注意事项6、类组件中事件的使用7、类组件响应式数据实现与原理8、PureComponent 与 shouldComponentUpdate9、immutable…

Java数据结构之《构造哈夫曼树》题目

一、前言&#xff1a; 这是怀化学院的&#xff1a;Java数据结构中的一道难度中等(偏难理解)的一道编程题(此方法为博主自己研究&#xff0c;问题基本解决&#xff0c;若有bug欢迎下方评论提出意见&#xff0c;我会第一时间改进代码&#xff0c;谢谢&#xff01;) 后面其他编程题…

Difference between getc(), getchar(), and gets()

getc(): 从输入中只能读单个字符 getchar()&#xff1a;从标准输入流中输入都单个字符。 两者基本等同&#xff0c;唯一不一样的是getc()是任何输入流&#xff0c;而getchar()是标准输入流。 gets:可以读入含有空格的字符串 // Example for getc() in C #include <stdio.h…

Vue使用@import 引入样式文件全局污染、使用scoped失效问题

scoped 在组件中的style使用import方式引入外部css&#xff0c;发现引入的css会污染到其他地方。即所谓的样式全局污染。不管加不加scoped都一样。 <style lang"scss" scoped>import url("/style/index.scss") <style> 上面这种情况即时加入…

perl脚本批量处理代码中的中文注释乱码的问题

代码中统一使用utf-8编码是最好的&#xff0c;但是有一些多人合作的项目或者一些历史遗留代码&#xff0c;常见一些中文注释乱码的问题。这里以一个开源项目evpp为例子 evpp。以项目中的一个commit id为例&#xff1a; 477033f938fd47dfecde43c82257cd286d9fa38e &#xff0c; …

算法设计与实现--动态规划篇

什么是动态规划算法 动态规划算法是一种求解复杂问题的方法&#xff0c;通过将原问题分解为相对简单的子问题来求解。其基本思想是将待求解的问题分解为若干个子问题&#xff08;阶段&#xff09;&#xff0c;按顺序求解子阶段&#xff0c;前一子问题的解&#xff0c;为后一子…

YOLOV8改进:在C2f模块不同位置添加SegNext_Attention

1.该文章属于YOLOV5/YOLOV7/YOLOV8改进专栏,包含大量的改进方式,主要以2023年的最新文章和2022年的文章提出改进方式。 2.提供更加详细的改进方法,如将注意力机制添加到网络的不同位置,便于做实验,也可以当做论文的创新点。 3.涨点效果:SegNext_Attention注意力机制,实现…

市面上的AR眼镜:优缺点分析

AR眼镜是近年来备受关注的科技产品之一。它通过将虚拟信息叠加到现实世界中&#xff0c;为用户提供全新的视觉体验。目前&#xff0c;市面上的AR眼镜主要分为两类&#xff1a;消费级AR眼镜和企业级AR眼镜。 消费级AR眼镜 消费级AR眼镜的特点是轻便、时尚、易于佩戴&#xff0…

面部动作在情绪识别中的作用(nature reviews psychology2023)

文章目录 摘要静态情绪识别动态情感识别时空信息独特的时间信息 动态表情识别的机制动态信息为什么重要什么时候动态信息起作用为什么动态信息很重要 多模态表情识别启发 摘要 过去大多数关于情绪识别的研究都使用了摆拍的表情照片&#xff0c;旨在描绘情绪表现的峰值。虽然这…

正则表达式从放弃到入门(2):grep命令详解

正则表达式从放弃到入门&#xff08;2&#xff09;&#xff1a;grep命令详解 总结 本博文转载自 这是一篇”正则表达式”扫盲贴&#xff0c;如果你还不理解什么是正则表达式&#xff0c;看这篇文章就对了。 如果你是一个新手&#xff0c;请从头阅读这篇文章&#xff0c;如果你…

Mysql窗口函数

1 什么是窗口函数 MySQL从8.0开始支持窗口函数&#xff0c;有的也叫分析函数&#xff08;处理相对复杂的报表统计分析场景&#xff09;&#xff0c;这个功能在大多商业数据库和部分开源数据库中早已支持。 窗口函数&#xff1a;窗口、函数&#xff08;应用在窗口内的函数&…

P-Tuning v2论文概述

P-Tuning v2论文概述 P-Tuning v2论文概述前言微调的限制性P-Tuning的缺陷P-Tuning v2 摘要论文十问NLU任务优化点实验数据集预训练模型实验结果消融实验 结论 P-Tuning v2论文概述 前言 微调的限制性 微调&#xff08;fine-tuning&#xff09;是一种在预训练模型基础上进行目…

docker常见知识

docker常见命令 名字描述用处run创建一个新的容器并运行一个命令容器生命周期管理start/stop/restart启动、停止、重启容器容器生命周期管理kill杀掉容器、杀死进程容器生命周期管理rm删掉一个容器&#xff0c;删除历史容器容器生命周期管理pause/unpause暂停或者恢复容器中所…

[Java]轻松掌握JDK和CGlib代理的使用技巧,让你的Java程序性能更卓越!

JDK代理与CGlib代理 是什么 JDK代理&#xff1a;JDK代理是一种基于接口的动态代理&#xff0c;它实现了被代理对象所实现的接口&#xff0c;可以在运行时通过反射的方式来生成代理对象。 CGlib代理&#xff1a;CGlib代理是一种基于类的动态代理&#xff0c;它通过生成被代理…

中国人工智能

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;作为一项前沿技术在各个领域展现出了强大的潜力。本文将探讨中国人工智能的历史、现状&#xff0c;并展望其未来发展。 人工智能的起源与历史 人工智能的概念最早诞生于1956年的美国达特茅斯学院的夏季研讨会…

【数据库】数据库元素的层次,树形结构的下的多粒度加锁,以及幻象的正确处理

数据库元素的层次 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会定期…

Bootstrap 5 中文文档 (简体中文)

Bootstrap 5 中文文档 &#xff08;简体中文&#xff09;&#xff1a; Bootstrap 4 繁體中文手冊 (中文(繁體))Bootstrap 5 繁體中文手冊 (中文(繁體))Bootstrap 5 中文文档 (Simplified Chinese)

linux内核bio子系统学习记录一:

bio子系统学习一&#xff1a; 主要源码目录 :block/bio.c include/linux/bio.h 内核版本&#xff1a;4.19.1 这部分先总结下bio子系统的初始化部分&#xff0c;后续再总结bio的申请以及释放&#xff0c;还有其它api的使用等介绍。 bio的涉及到频繁的内存申请以及释放&#x…

(学习笔记)Xposed模块编写(一)

前提&#xff1a;需要已经安装Xposed Installer 1. 新建一个AS项目 并把MainActvity和activity_main.xml这两个文件删掉&#xff0c;然后在AndriodManifest.xml中去掉这个Activity的声明 2. 在settings.gralde文件中加上阿里云的仓库地址&#xff0c;否则Xposed依赖无法下载 m…

【llm使用】ChatGLM3-6B Transformers部署调用

文章目录 环境准备模型下载代码准备部署 说明&#xff1a;本文转自国内开源组织datawhale的repo&#xff1a; self-llm 环境准备 在autodl平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打…