fastson与jackson入门

一,简介

json: JavaScript Object Notation, JS对象简谱。

官网:JSON官网

二,使用场景

  • 网络传输

​ 描述同样的信息,json相比xml占用更少的空间,

<?xml version="1.0" encoding="uTF-8"?>
<person><id>1</id><name>张三</name><age>30</age>
</person>
{"id":1,"name":"张三","age": 30
}

三,java里面操作json有哪些技术?

  • 所谓的操作

把java里面的bean, map, collection等转为json字符串(序列化)或反向操作(反序列化)。

  • Java里操作json的技术一览

image-20240919091223461

四,fastjson(漏洞频发)

<!--https://mvnrepository.com/artifact/com.alibaba/fastjson-->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.73</version>
</dependency>

4.1 序列化

  • 包含null
  • 日期时间格式化
  • 奇怪的"$ref"
  • SerializeFilter定制处理
    • 对属性或属性值在序列化前做定制化处理

4.2 反序列化

  • 泛型处理
    • fastjson对于json中多key默认的处理就是忽略
  • 美化输出

示例

package com.roadjava.json.fastjson;import lombok.Data;
/**
* @author chengyixuan
* @see <a href="http://www.roadjava.com">乐之者Java</a>
*/
@Data
public class Person {/*** 用户id*/private Long id;private String name;private String pwd;/*** 地址*/ private String addr;/*** 网站*/private String websiteUrl;@JSONField(format = "yyyy-MM-dd HH:mm:ss");private Date registerDate;private LocalDateTime birthDay;}
public class ResultVO<T> {private Boolean success = Boolean.TRUE;private T data;private ResultVO(){}public static <T> ResultVT<T> buildSuccess(T t) {ResultVO<T> resultVO = new ResultVO<>();resultVO.setData(t);return resultVO;}
}public class FastJsonTest {/*** 测试反序列化* json字符串 --> bean*/@Testpublic void testDeSerialize() {String jsonStr = "{\"addr\":\"河南\",\"birthDay\":\"2021-08-17 03:23:18\", \"id\":1}";// 反序列化为person对象Person person = JSON.parseObject(jsonStr, Person.class);System.out.println(person);//返回给调用端ResuLtVOResultVo<Person> personResultVo = ResultVo.buiLdSuccess(person);String voJsonStr = JSON.toJSoNString(personResultVO);//调用端需要把voJsonStr反序列化为对象
//        ResultVO0 resultVO = JSoN.parseObject(voJsonStr, ResultVo.class);
//        System.out.println("resultvo"+resultvo);//       Object data = resultVO.getData();// 需要反序列化为什么类型,就给TypeReference传入什么类型就可以ResultVO<Person> deSerializedVo = JSON.parseObject(voJsonStr, new TypeReference<ResultVO<Person>>) {}System.out.println("deSerializedVo:"+deSerializedVo);Person data = deSerializedVo.getData();System.out.println("data:"+data);}/*** SerializeFilter定制处理.要求* 输出的json字符串的Key是大写的。*/@Testpublic void testSerializeFilter() {Person person = new Person();person.setId(1L);
//        person.setName("乐之者java");person.setPwd("123");person.setAddr("河南");person.setWebsiteUrl("http://www.roadjava.com");person.setRegisterDate(new Date());person.setBirthDay(LocalDateTime.now());/** object:person对象* name:属性* vaLue:name属性对应的值*/NameFilter nameFilter = (object,name,value) -> name.toUpperCase();String string = JsoN.toJsoNString(person,nameFilter);System.out.println(string);}/*** 测试fastjson的引用探测* $ref: 象中多次引用了同一个其他对象的时候,序列化就会出现$ref*/@Testpublic void test$Ref() {List<Person>listt = new ArrayList<>();Personpersonn= new Person();person.setId(33L);person.setName("乐之者java");|list.add(person);list.add(person);list.add(person);// DisableCircularReferenceDetect 禁用引用探测功能String string = JSON.toJSONString(list, SerializerFeature.DisableCircuLarReferenceDetect); System.out.println(string);}/*** 测试序列化* 把bean转为json字符串*/@Testpublic void test1(){Person person = new Person();person.setId(1L);person.setPwd("123");person.setAddr("河南");person.setWebsiteUrl("http://www.roadjava.com");person.setRegisterDate(new Date());person.setBirthDay(LocalDateTime.now());// 序列化/** WriteMapNullValue:指定序列化时包含null*/String string = JSON.toJSONString(person, SerializerFeature.WriteMapNullValue);// 美化格式输出// String string = JSON.toJSONString(person, true);System.out.println(string);}}

4.3 通用配置

  • 指定属性名和json字符串key的对应关系
  • 忽略指定属性

五,jackson

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version>
</dependency>
<!--对Loca1DateTime等jdk8时间目期api的转化支持-->
<dependency><groupId>com.fasterxml.jackson.datatype</groupId><artifactId>jackson-datatype-jsr310</artifactId><version>${jackson.version}</version>
</dependency>

5.1 序列化

  • 只包含非null属性
    • 全局配置
    • 单个的bean配置
  • 日期时间格式化
    • 全局配置
    • 单个的bean配置

5.2 反序列化

  • 忽略不存在的key
  • 泛型处理

示例


public class User {/*** 用户id*/ private Long id;private String name;@Jsonignoreprivate String pwd;/*** 地址*/@JsonProperty("address")private String addr;/*** 网站*/private String websiteUrl;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")private Date registerDate;private LocalDateTime birthDay;
}
public class JacksonTest {private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";private static ObjectMapper objectMapper = new ObjectMapper();static {/*** 序列化的配置*/// 特殊配置: 配置序列化时只包含非空属性// 对Data进行配置, SimpleDateFormat是线程不安全的objectMapper.setDateFormat(new SimpLeDateFormat(DATE_TIME_FORMAT));// 美化输出objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);// 驼峰转下划线 userName -- user_nameobjectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);/*** 反序列的配置*/// 两种写法是一样的objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PEOPERTIES);/*** 全局的配置*/// 自动通过spi发现jackson的module并注册生效//   objectMapper.findAndRegisterModules();// 手动配置JavaTimeModule并注册。JavaTimeModule javaTimeModule = new JavaTimeMOdule();javaTimeMOdule.addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE);objectMapper.registerModule(javaTimeModule);}/*** 对象更新, 对象的合并,如果有后者的属性有值,则用后者,否则前者的值不变*/@Testpublic void test3() throws Exception {User originaluser = new User();originalUser.setId(1L);user.setName("乐之者java");user.setWebsiteUrl("http://www.roadjava.com");User newUser = new User();newUser.setId(2L);newUser.setName("乐之者java");newUser.setWebsiteUrl("http://www.roadjava.com”);User updateUser = objectMapper.updateValue(originalUser, newUser);// id:2 name: 乐之者 java websiteUrl:System.out.println(updatedUser);                      }/***泛型的处理*/@Testpublic void test3() throws Exception {User user = new User();user.setName("乐之者java");user.setWebsiteUrl("http:www.roadjava.com");ResultDTO<User> userResultDTO = ResultDTo.buiLdSuccess(user);String dtoSerializationResult = objectMapper.writeValueAsString(userResultDTO);// 反序列化为ResultDTO<User>ResultDTO<User> deSerializationResult = objectMapper.readValue(dtoSerializationResult, new TypeReference<Object>() {});System.out.println("data:", ResultDTD.getData());}/***反序列化*/@Testpublic void test2() throws Exception {String str = "{\"id\":1, \"age\":88, \"pwd\":\"123\", \"addr\":\"河南\", \"websiteUr1\":}"User user = objectMapper.readValue(str, User.class);System.out.println(user);}/*** 序列化*/@Testpublic void testl() {User user = new User();user.setId(1L);//       user.setName ("乐之者java");user.setPwd("123");user.setAddr("河南");user.setWebsiteUrl("http://www.roadjava.com");user.setRegisterDate(new Date());user.setBirthDay(LocalDateTime.now());String string = ObjectMapper.writeValueAsString(user);System.out.println(string);}}

5.3 通用配置

  • 序列化: 驼峰转下划线/反序列化: 下划线转驼峰
  • 指定属性名和json字符串key的对应关系
  • 忽略指定属性

5.4 其他应用

  • 对象更新

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

电气自动化入门03:安全用电

视频链接&#xff1a;2.1 电工知识&#xff1a;触电原因与防触电措施_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1PJ41117PW/?p4&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.电流对人体的危害 电击&#xff1a;电流通过人体。 电伤&#xff1a;电流热效应…

魅族20机型 M2381“工程固件”作用分析以及写入步骤

在上期的博文中简单说明了工程固件的作用。对于资深玩家来说写入工程固件可以调试参数或者格机 误檫除全分区后的底层修复,但对于一般玩家来说不推荐写入。固件本身的作用是修复与调校。有些操作是不可逆。工程固件实际是用于机型开发到量产中帮助开发人员检查和修复软件中的问…

小米机型“工程固件” 小米13工程资源预览 写入以及nv损坏修复

目前各大品牌机型中。可以录数于小米机型的工程固件最全 最多。这个也由于小米机型的加密机制比较特殊 。每款新机型发布后不久。工程包就会出现。从小米5起始以及红米note4起始都有工程固件。另外在维修行业中。米系机型更换cpu都需要先写入对应的绑定包。然后才可以写入官方m…

Windows如何查看已缓存的DNS信息

Windows server 2016如何查看已缓存的DNS信息 在Windows server 2016系统下&#xff0c;如何查看已缓存的DNS信息呢? 1.打开“运行”&#xff0c;输入cmd&#xff0c;点击“确定” 2.在命令行界面输入ipconfig /displaydns&#xff0c;按回车即可查看已缓存的dns信息

企业如何做好B站信息流广告投放?

B站作为年轻人喜爱的视频分享平台&#xff0c;以其独特的弹幕文化、丰富的视频内容和活跃的社区氛围&#xff0c;成为了众多企业竞相追逐的流量高地。B站信息流广告凭借其精准投放、高互动性和强大的用户粘性&#xff0c;成为了企业实现营销目标的重要渠道。 一、B站信息流广告…

JSONC:为JSON注入注释的力量

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;广泛应用于Web开发、配置文件和数据存储等领域。 其简洁的语法和易于解析的特点&#xff0c;使得JSON成为了现代编程中不可或缺的一部分。然而&#xff0c;JSON的一个显著缺点是…

美创科技唯一入选安全领域数字工程服务商并获“四星”评定!

近日&#xff0c;第二批浙江省数字工程服务商&#xff08;企业数字化转型服务商&#xff09;星级评价结果公布&#xff0c;美创科技入围“四星级-安全-数字工程服务商”。 评审专家对美创科技研发能力、技术与创新能力等6个维度均给予高分评定&#xff0c;数字工程服务商能力分…

Android 车载应用开发指南 - CarService 详解(下)

车载应用正在改变人们的出行体验。从导航到娱乐、从安全到信息服务&#xff0c;车载应用的开发已成为汽车智能化发展的重要组成部分。而对于开发者来说&#xff0c;如何将自己的应用程序无缝集成到车载系统中&#xff0c;利用汽车的硬件和服务能力&#xff0c;是一个极具挑战性…

BPG的定义和工作原理是什么?

在当今互联网中&#xff0c;网络通信的关键角色之一是BGP&#xff08;边界网关协议&#xff09;。BGP是一种路由矢量协议&#xff0c;负责在自治系统之间交换路由信息&#xff0c;并帮助数据包找到通过网络的理想链路。本文将介绍BGP、BGP4和BGP4&#xff0c;以及它们在网络中的…

深入探索Android开发之Kotlin核心技术学习大全

Android作为全球最流行的移动操作系统之一&#xff0c;其开发技能的需求日益增长。本文将为您介绍一套专为Android开发者设计的Kotlin核心技术学习资料&#xff0c;包括详细的学习大纲、PDF文档、源代码以及配套视频教程&#xff0c;帮助您从Kotlin基础到高级特性&#xff0c;再…

观《中国数据库前世今生》有感:从历史中汲取未来的力量

观《中国数据库前世今生》有感&#xff1a;从历史中汲取未来的力量 中国数据库技术的起步与发展 观看了《中国数据库前世今生》后&#xff0c;我对于中国数据库技术的历史变迁有了更深刻的理解。作为一名有一年开发经验的程序员&#xff0c;这部纪录片让我对中国数据库行业从8…

解析药用植物重楼甾体皂苷生物合成中的连续糖基化及其抗真菌作用-文献精读49

Unraveling the serial glycosylation in the biosynthesis of steroidal saponins in the medicinal plant Paris polyphylla and their antifungal action 解析药用植物重楼甾体皂苷生物合成中的连续糖基化及其抗真菌作用 摘要 糖–糖糖基转移酶在构建复杂的具有生物活性的…

解决Filament中使用ARCore出现绿色闪屏的问题

解决Filament中使用ARCore出现绿色闪屏的问题 问题现象 使用AR的工程中&#xff0c;出现绿屏闪烁。问题帧截图如下&#xff1a; 问题定位 问题来源 在filament的1.21.0之前的版本&#xff0c;Stream对象提供了stream(long externalTextureId)方法&#xff0c;允许传递一个…

游戏如何对抗定制挂

近年来&#xff0c;游戏安全对抗强度相比以往更加激烈&#xff0c;具体表现在“定制挂”趋势显著。在近期收集的近万款外挂样本中&#xff0c;定制挂约占比78%&#xff0c;常见的内存修改器、变速器等通用作弊手段占比正在下降。 所谓定制挂&#xff0c;是指针对某款游戏单独开…

阅读笔记——《围城》

文前辅文&#xff1a;围在城里的人想逃出来&#xff0c;/城外的人想冲出去&#xff0c;/对婚姻也罢&#xff0c;职业也罢&#xff0c;/人生的愿望大都如此。 笔记 方鸿渐在海外&#xff08;欧洲&#xff09;留学&#xff0c;期间一直在玩&#xff0c;最终买了一个学位后回国&a…

SVM原理

SVM 这里由于过了很长时间 博主当时因为兴趣了解了下 博主现在把以前的知识放到博客上 作为以前的学习的一个结束 这些东西来自其他资料上 小伙伴看不懂英文的自行去翻译下吧 博主就偷个懒了 多维空间和低维空间 不一样的分法&#xff0c;将数据映射到高维 &…

为什么越来越多的企业选择设置外包岗位?

对于很多人而言&#xff0c;外包并不陌生。特别是在互联网大厂&#xff0c;像阿里、腾讯等&#xff0c;其内部有不少岗位都采取了外包形式。甚至政府部门也会把IT/自媒体之类的外包给专业的公司来运营&#xff0c;对于企业或者单位来说&#xff0c;这是进行成本优化后的最佳选择…

假期学习--iOS 编译链接

iOS 编译链接 编译流程 四步&#xff1a; 1.预处理 2.编译 3.汇编 4.链接 大概的步骤如下&#xff1a; 预处理 作为编译的第一步&#xff0c;将.m文件转换为.i文件 &#xff1b; 预处理是要处理源代码中所有以#开头的所有预编译指令 &#xff1b; 规则如下&#xff1…

Flutter局域网广播(UDP通信)与TCP通信

前言 现在有一个需求&#xff0c;手机和ESP32通过WIFI进行通信。流程如下&#xff1a; 手机创建TCP服务器手机向192.168.0.255的1002端口广播自己的ip地址以及TCP服务器的端口号ESP32监听到1002的广播内容后&#xff0c;连接手机的TCP服务器。最后就是ESP32硬件和TCP服务器进…

【Python】Anaconda插件:Sublime Text中的Python开发利器

上班的时候没人问我苦不苦&#xff0c;下班的时候总有人问为什么走这么早。 Anaconda 是一个专为Sublime Text打造的开源Python开发插件&#xff0c;旨在为开发者提供类似于IDE的丰富功能&#xff0c;提升Python编码效率。该插件提供了代码补全、语法检查、代码片段提示等多项…