fastson与jackson重点笔记(包入门)

news2024/12/26 2:32:44

一,简介

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
    */
    @Test
    public 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);
        //返回给调用端ResuLtVO
		ResultVo<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是大写的。
    */
    @Test
    public 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
    */
    @Test
    public 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字符串
    */
    @Test
    public 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;
    @Jsonignore
    private 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_name
        objectMapper.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);
	}
    /**
    * 对象更新, 对象的合并,如果有后者的属性有值,则用后者,否则前者的值不变
    */
    @Test
    public 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);                      
    }
    /**
    *泛型的处理
    */
    @Test
    public 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());
    }
    /**
    *反序列化
    */
    @Test
    public 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);
    }
    /**
    * 序列化
    */
    @Test
    public 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.coloradmin.cn/o/2159100.html

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

相关文章

S32K3 工具篇8:如何移植RTD MCAL现有demo到其他K3芯片

S32K3 工具篇8&#xff1a;如何移植RTD MCAL现有demo到其他K3芯片 一&#xff0c;文档简介二 &#xff0c;平台以及移植步骤2.1 平台说明2.2 移植步骤2.2.1 拷贝工程并配置2.2.1.1 拷贝工程2.2.1.2 配置工程 2.2.2 EB 工程配置 三&#xff0c; 命令行编译及其结果测试四&#x…

【学习笔记】Linux系统基础知识3 —— cd命令详解

一、前期准备 1.已经正确安装并成功进入Linux系统 说明&#xff1a;本实验采用的 Redhat 系统&#xff08;因系统不一致&#xff0c;可能部分显示存在差异&#xff09; 二、学习内容 提示&#xff1a;学习Linux系统基础命令 cd 命令详解 1、cd命令 1. 功能说明 cd 命令用…

AI模型对比研究员创意

大语言模型可以接受训练&#xff0c;完成许多任务。其中最广为人知的用途之一是作为生成式人工智能&#xff1a;当收到提示或被问到问题时&#xff0c;它们可以生成文本作为答复。例如&#xff0c;公开的大语言模型 ChatGPT 可以根据用户输入生成文章、诗歌和其他文本形式。 任…

kettle从入门到精通 第八十七课 ETL之kettle kettle文件上传

1、kettle本身文件上传功能不是很友好&#xff0c;甚至是不能直接使用&#xff0c;需要调整文件上传接口才可以正常接收到文件&#xff0c;本次讲解内容主要是通过自定义插件解决这个问题。 2、通过springboot 编写简单demo&#xff0c;模拟文件上传&#xff0c;接口支持三个参…

vue-router路由(重定向,嵌套,动态路由匹配,命名,高亮,守卫)

一、前端路由的概念与原理 路由router就是对应关系。分为前端路由和后端路由。 1后端路由 后端路由指的是&#xff1a;请求方式、请求地址与function处理函数之间的对应关系。在node.js中&#xff0c;express理由的基本用法如下&#xff1a; const express require(expres…

Simple Calculator(算法初阶,代码基础,“纯”手撕)

简单计算器&#xff1a;仅适用无括号加减乘除&#xff0c;算法初阶&#xff0c;代码基础&#xff0c;不调库或模块“纯”手撕。 (笔记模板由python脚本于2024年09月22日 12:08:02创建&#xff0c;本篇笔记适合喜欢用python解决实际问题的coder翻阅) 【学习的细节是欢悦的历程】…

有关在.Net Core中以TEXT类型将Json格式字段存到数据库的学习

导言 在写个值日接口时发现值日表中的值日时段是可以分多段的&#xff0c;想了想可以使用Json类型来存&#xff0c;不过之前没接触过在后端操作Json格式存到数据库的情况&#xff0c;之后学也了解到了一下方法来实现&#xff0c;故记录一下。 过程 从前端到后端再到数据库的 JS…

图片切换示例【JavaScript】

在 JavaScript 中实现图片切换可以通过多种方法&#xff0c;下面是一个简单的示例&#xff0c;使用 HTML、CSS 和 JavaScript 来实现图片的切换效果。 实现效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta c…

VMware Workstation 17.5安装教程

目录 软件介绍 1、下载安装包 2、安装虚拟机 3、卸载虚拟机 软件介绍 VMware&#xff08;虚拟机&#xff09;是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统&#xff0c;通过它可在一台电脑上同时运行更多的Microsoft Windows、Linux…

看Threejs好玩示例,学习创新与技术(React-three-fiber)

什么&#xff0c;竟有人把ThreeJS和React绑定在一起&#xff0c;混着用&#xff1f; 1、VUE劫持问题 暂先把今天的问题先放一边&#xff0c;先简单回顾下vue劫持的情况。vue会把data里面的数据自动转换为属性&#xff0c;方便界面与数据交互。这本身是没有任何问题&#xff0…

快手旗下——Kolors模型部署与使用指南

以下是按照要求重写后的 Kolors 模型部署与使用指南&#xff0c;文章风格偏技术性&#xff0c;但保持简洁和易懂的特点&#xff1a; Kolors 模型部署与使用指南 一、Kolors 简介 Kolors 是由快手 Kolors 团队开发的文本到图像生成模型&#xff0c;基于大规模的潜在扩散技术。…

找不到libcef.dll怎么办,libcef.dll丢失怎么重新安装

在计算机使用过程中&#xff0c;我们常常会遇到各种问题。其中&#xff0c;libcef.dll丢失是一个常见的错误提示。libcef.dll是Chromium Embedded Framework的动态链接库&#xff0c;它是许多应用程序和游戏所必需的组件。当libcef.dll丢失或损坏时&#xff0c;可能会导致程序无…

2025秋招内推|招联金融

【投递方式】 直接扫下方二维码&#xff0c;使用内推码: igcefb 【招聘岗位】 深圳&#xff0c;武汉&#xff1a; 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策划 产品运营 客户体验管理 风险管理 资产管理 【校招流程】 简历投递&#xff1a;9月…

死磕P7: JVM内存划分必知必会(一)

这是「死磕P7」系列第 001 篇文章&#xff0c;欢迎大家来跟我一起 死磕 100 天&#xff0c;争取在 2025 年来临之际&#xff0c;给自己一个交代。 JVM 内存区域划分是面试常考点&#xff0c;属于死记硬背型&#xff0c;比较让人头大的是不同版本的 JDK 具有不同的划分方式&…

计算机毕业设计 基于Python的医疗预约与诊断系统 Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

联合复现!考虑最优弃能率的风光火储联合系统分层优化经济调度!

前言 目前&#xff0c;尽管不断地追逐可再生能源全额消纳方式&#xff0c;大幅减小弃风弃光电量&#xff0c;但是若考虑风电、光伏发电的随机属性&#xff0c;全额消纳可能造成电网峰谷差、调峰难度及调峰调频等辅助服务费用的剧增&#xff0c;引起电网潜在运行风险。因此&…

英特尔AI加速器Gaudi 3下周发布,挑战NVIDIA统治地位!

英特尔正稳步推进其2024年计划&#xff0c;备受瞩目的AI加速器Gaudi3预计将于下周震撼登场。这款被誉为英特尔AI英雄的产品&#xff0c;专注于处理大规模训练和推理任务&#xff0c;拥有无与伦比的扩展能力。面对市场对高效能半导体的旺盛需求&#xff0c;英特尔首席执行官帕特…

Snap 发布新一代 AR 眼镜,有什么特别之处?

Snap 发布新一代 AR 眼镜&#xff0c;有什么特别之处&#xff1f; Snap 简介 新一代的 AR 眼镜特点 Snap 简介 Snap 公司成立于 2010 年&#xff0c;2017 年美国东部时间 3 月 2 日上午 11 时许&#xff0c;在纽交所正式挂牌交易&#xff0c;股票代码为 “SNAP”。其旗下的核…

力扣 2529.正整数和负整数的最大计数

文章目录 题目介绍解法 题目介绍 解法 采用红蓝染色体法&#xff0c;具体介绍参考 红蓝染色体法 通过红蓝染色体法可以找到第一个大于大于target的位置&#xff0c;使所以本题可以找第一个大于0的位置&#xff0c;即负整数的个数&#xff1b;数组长度 - 第一个大于1的位置即正…