Json 序列化和反序列化研究

JSON的序列化和反序列化 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于前后端的接口数据格式。 阅读详情

目录

概念

问题

试验一

用People 类来做试验,注意代码

针对fastjson

针对gson

试验二

修改People 类

针对fastjson

针对gson

fastjson 序列化和反序列化的风险

结论

思考

什么是 javabean 

关于属性值和 get/set 方法是这样的

gson 和 fastjson 的处理对象

相关规范


概念

json 序列化:把 javabean 转换成 json 字符串
json 反序列化:把 json 字符串转换成对应的 javabean

 

问题

序列化时,是调用 getXxx 方法来获取 xxx 属性的值吗?
反序列化时,是调用 setXxx 方法来设置 xxx 属性的值吗?

 

试验一

用People 类来做试验,注意代码

public class People {
    /** 姓名 **/
    private String name;
    /** 身高 m **/
    private double height;
    /** 体重 kg **/
    private double weight;
    /** bmi 指数 **/
    private double bmi;




    public String getName() {
        return name;
    }




    public void setName(String name) {
        this.name = name;
    }




    public double getHeight() {
        return height;
    }




    public void setHeight(double height) {
        this.height = height;
    }




    public double getWeight() {
        return weight;
    }




    public void setWeight(double weight) {
        this.weight = weight;
    }




    public double getBmi() {
        bmi = weight / (height * height);
        return bmi;
    }




    public void setBmi(double bmi) {
        this.bmi = bmi;
    }


}

针对fastjson

    @Test
    public void fastjson() {
        People people = new People();
        people.setName("八戒");
        people.setWeight(100.00);
        people.setHeight(1.70);
        people.setBmi(30);
        
        log.info(JSON.toJSONString(people));
        
    }

输出结果为

{"bmi":34.602076124567475,"height":1.7,"name":"八戒","weight":100.0}

可见,fastjosn 是调用了 getXxx 方法来获取属性值

 

针对gson

    @Test
    public void gson() {
        People people = new People();
        people.setName("八戒");
        people.setWeight(100.00);
        people.setHeight(1.70);
        people.setBmi(30);
        
        log.info(new Gson().toJson((people)));
        
    }

输出结果为

{"name":"八戒","height":1.7,"weight":100.0,"bmi":30.0}

可见,gson 是直接获取 xxx 属性的值

 

试验二

修改People 类

删除 bmi 属性,仅保留 getBmi() 方法,如下

public class People {
    /** 姓名 **/
    private String name;
    /** 身高 m **/
    private double height;
    /** 体重 kg **/
    private double weight;




    public String getName() {
        return name;
    }




    public void setName(String name) {
        this.name = name;
    }




    public double getHeight() {
        return height;
    }




    public void setHeight(double height) {
        this.height = height;
    }




    public double getWeight() {
        return weight;
    }




    public void setWeight(double weight) {
        this.weight = weight;
    }




    public double getBmi() {
        return weight / (height * height);


    }


}

针对fastjson

    @Test
    public void fastjson() {
        People people = new People();
        people.setName("八戒");
        people.setWeight(100.00);
        people.setHeight(1.70);
        // people.setBmi(30);
        
        log.info(JSON.toJSONString(people));
        
    }

输出结果为

{"bmi":34.602076124567475,"height":1.7,"name":"八戒","weight":100.0}

可见,即使不存在属性,但只要有 get 方法,fastjosn 会视同有这个属性
 

针对gson

    @Test
    public void gson() {
        People people = new People();
        people.setName("八戒");
        people.setWeight(100.00);
        people.setHeight(1.70);
        // people.setBmi(30);
        
        log.info(new Gson().toJson((people)));
        
    }

输出结果为

{"name":"八戒","height":1.7,"weight":100.0}

可见,gson 不会根据 get 方法来推断属性

fastjson 序列化和反序列化的风险

由于 fastjson 是根据 get 方法来推断属性并取值,就存在这样的风险:一个对象,经过 fastjson 序列化再反序列化以后,会得到一个不相等(equals)的对象,看下面代码

public class Car {


    private String brand;
    private long   speed;




    public String getBrand() {
        return brand;
    }




    public void setBrand(String brand) {
        this.brand = brand;
    }




    public long getSpeed() {
        if (speed < 100) {
            speed = 100;
        } else {
            speed = 200;
        }
        return speed;
    }


}


测试用例如下

    @Test
    public void test() {
        Car car = new Car();
        car.setBrand("bmw");
        String json = JSON.toJSONString(car);
        log.info(json);
        Car car1 = JSON.parseObject(json, Car.class);
        Assert.assertNotEquals(car.getSpeed(), car1.getSpeed());


    }


运行测试,发现两个对象并不相等

结论

虽然上面仅对 get 方法进行了试验,没有试验 set 方法,但应该不影响结论——无论是用 fastjson 还是 gson 对一个 java 对象进行序列化/反序列化,都要确保以下 2 点,否则可能会出现莫名其妙的问题。
(1) get/set 方法对应的属性存在
(2)属性值和通过 get 方法得到的值相同:即在 get/set 方法里不要做额外的操作


 

思考

什么是 javabean 

到底什么是 javabean?wikipedia 的[https://en.wikipedia.org/wiki/JavaBeans 定义]如下

In computing based on the Java Platform, JavaBeans are classes that encapsulate many objects into a single object (the bean). They are serializable, have a zero-argument constructor, and allow access to properties using getter and setter methods


关于属性值和 get/set 方法是这样的

access to properties using getter and setter methods

根据这个说法,我认为 get/set 方法是用来访问属性值的,这意味着如果没有这个属性,就不该有 get/set 方法。get/set 方法应该是获取/设置属性值,而不包含其他功能。


 

gson 和 fastjson 的处理对象

先看 gson

A Java serialization/deserialization library to convert Java Objects into JSON and back
Gson is a Java library that can be used to convert Java Objects into their JSON representation. It can also be used to convert a JSON string to an equivalent Java object. Gson can work with arbitrary Java objects including pre-existing objects that you do not have source-code of.

gson 是对 java 对象进行序列化和反序列化的库,并没有限定在 javabean 上,我的想法是(未验证)
 gson 默认是对 javabean 进行操作并遵循 javabean 的规范
 gson 也可以操作非 javabean 的对象,但该对象要通过特殊的注解来标记需要处理的属性或方法


再看 fastjson

A fast JSON parser/generator for Java
Fastjson is a Java library that can be used to convert Java Objects into their JSON representation. It can also be used to convert a JSON string to an equivalent Java object. Fastjson can work with arbitrary Java objects including pre-existing objects that you do not have source-code of.

fastjson竟然和gson是一模一样的。

相关规范

由于不同的 json 库实现上存在差异,所以我们需要定义出一个规范来:json 库用哪一个?

这里明确规定
(1) json 库使用 fastjson,版本尽量用最新版
(2)凡是需要用 fastjson 进行序列化和反序列化的 java 对象,必须是 javabean——也就是说,不得在 get/set 方法里执行获取/设置属性值以外的代码

PEMFC电化学入门:从电流密度到Tafel公式的实战计算指南 本文详细介绍了PEMFC电化学的基础知识,从电流密度计算到Tafel公式的应用,提供了实战计算指南。通过代码示例和常见问题排查,帮助工程师快速掌握燃料电池性能优化的关键参数,如交换电流密度和活化损失计算,适用于汽车动力和分布式发电等领域。 阅读详情

相关推荐

ROS开发者的福音:用Anaconda虚拟环境解决Python包冲突(附完整配置流程)

本文为ROS开发者提供了使用Anaconda虚拟环境解决Python包冲突的完整方案。通过分析冲突根源,详细介绍了Miniconda安装、专用环境创建以及核心桥梁包的配置流程,并阐述了“混合环境运行”与“纯虚拟环境构建”两种实战工作流,帮助开发者实现ROS核心与特定Python库的和谐共存,从而提升开发效率和项目可维护性。

weixin_28835789的博客 336

Java中的Json序列化,不容忽视的getter

文章目录前言一、Java中的Json序列化,不容忽视的getter二、问题重现1.核心代码2.问题分析2.1常用 JSON序列化库 的序列化原理:总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、Java中的Json序列化,不容忽视的getter 示例:Springboot的项目 二、问题重现 1.核心代码 代码如下(示例):

qq_42307712的博客 1718

一篇关于轴承故障诊断的综述

在设备的故障检测中,有约30%-40%的设备故障是由轴承故障引起的,因此本文将列举有关检测轴承故障使用到的相关数据集,模型和算法。 数据集 现有的数据集,普遍由固定在电机马达上的两个震动检测器获得,并根据需要,分离震动数据在时域和频域上的特征以供网络模型学习。 不同的数据集,区别在于,检测的马达转速不同,环境不同,取样频率不同,一段样本的时长不同等等 (1)Case Western Reserve University (CWRU) Dataset 该数据集拥有多种数据,测量的时候,通过改变轴承.

weixin_42036144的博客 2万+

使用注解JSON序列化

JSON序列化

huangpf_vcx 1053

ICC2 高效上手 | create_lib 命令全攻略:数字后端工程师的必备秘籍

如果技术文件中的足够满足你的需求,你可以设置,然后运行create_lib命令;如果技术文件的精度不够,那就需要显式地使用来定义缩放因子。在使用create_lib必须显式指定库名(如my_libA推荐优先通过或来关联技术数据,确保你的设计库有正确的工艺基础。显式地通过-ref_libs定义参考库,这样可以避免工具自动推导时可能出现的冲突。慎重使用,只有在对数据精度有特殊需求时才显式指定,并且要确保它与参考库的缩放因子一致。

weixin_50820814的博客 1587

Matlab信号处理——基于BP神经网络的调制信号分类与识别

如果你想要进一步了解更多的相关知识,可以关注下面公众号联系~会不定期发布相关设计内容包括但不限于如下内容:信号处理、通信仿真、算法设计、matlab appdesigner,gui设计、simulink仿真......希望能帮到你!对信号进行采样和处理,得到了一系列特征参数,包括幅度均值、频率峰值、频率平方均值以及相位标准差、修正后的相位标准差。

小嘤熊的博客 1303

Json介绍——序列化与反序列化

介绍了json的序列化和反序列化概念,并用若干测试代码进行了json的序列化和反序列化使用展示

mrqiuwen的博客 1万+

RAID 0/1/5/10 性能实测:4块 SATA SSD 组阵列,顺序读写速度对比

本文通过实测对比了RAID 0/1/5/10在4块SATA SSD上的顺序读写性能,详细展示了不同RAID级别的配置方法、理论性能与实际测试数据。测试结果显示,RAID 0在顺序读写速度上表现最佳,而RAID 10则在性能与数据安全之间取得了平衡,适合数据库服务器等关键应用场景。

weixin_33462167的博客 413

json序列化框架处理isXxx属性时的注意事项

3、json框架序列化时根据bean的isSubOrg()方法,所以在生成json对象的key是subOrg,但是预期是生成isSubOrg;方法2:不要使用@Data生成getter(),应该使用快捷键生成,然后手动修改成getIsXxx()的形式;方法4:bean的布尔类型属性设置为包装类型Boolean(不要使用boolean)。2、使用快捷键或@Data()生成的getter()是isSubOrg();方法1:bean的boolean属性设置时不要以is作为小驼峰;方法3:使用Gson序列化对象;

weixin_44954895的博客 1440

制作Ubuntu22.04启动盘

现在越来越多程序代码都需要运行在linux环境下,运行这些代码的前提是安装一个稳定的linux操作系统。本文选择Ubuntu 22.04去制作系统启动盘。本文主要对ubuntu22.04的启动盘制作过程进行了详细的说明,希望能帮助到有需要的朋友。

lyx_ok的博客 1万+

lammps后处理:堆垛层错和孪晶的数量统计

python调用ovito包可以免费实现ovito pro版本的功能,不需要安装ovito pro软件,如统计位错线长度、CNA结构、键角分布等,如需深入学习,可考虑报名python ovito后处理课程,或lammps一对一课程。lammps金属变形模拟中,可能会产生堆垛层错或者孪晶等结构,但是ovito免费版本无法统计这些结构的数量。使用python和ovito软件包,则可以方便的统计出这些结构的数量。大家好,我是小马老师。

lammps_jiayou的博客 460

JSON 序列化和反序列化 讲解

一、什么是JSON 数据 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。 是JavaScript用来处理数据的一种格式,大部分是用来处理JavaScript和web服务器端之间的数...

天马3798 8480

基于UC3842的反激电源的全面深入解析与MATLAB仿真

内置电流检测,可实现电流模式控制,提高系统的动态响应性。多种保护功能,如欠压锁定、过温保护、短路保护等,确保系统的安全可靠运行。宽工作电压范围,适应不同的电源设计需求。简单的外部元件配置,易于实现。UC3842的典型应用包括开关电源、DC-DC转换器和反激式电源等,其稳定性和可靠性在实际应用中得到了广泛验证。

qq_38334677的博客 1077

Javascript的Json序列化与反序列化深入研究笔记

前言 从ES5.0开始引入原生的Json对象,Json对象有两个函数可以使用: JSON.stringify():用于将一个ECMA的数据类型的值序列化为一个Json TEXT。 JSON.parse():用于将一个Json TEXT反序列化为ECMA的数据类型的值。 Json TEXT归根到底是一个字符串。 -------参考Json数据格式_lengye7的博客-CSDN博客 序列化 Javascript中,value主要分为两类: 第一类是primitiv...

lengye7的博客 2126

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ASP.NET 中JSON “.NET研究”的序列化和反序列化

  JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式。在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间、集合、字典的处理。   一、JSON简介   JSON(JavaScript Object Notation,JavaSc...

weixin_33716557的博客 91

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

json 字段变成小写 序列化_Java反序列化协议解析 一

年前开始研究Java反序列化,一直没有研究Java反序列化文件的格式。最近闲来无事,研究一下java反序列化文件的格式。扯这么多的原因主要是达成两个目标尝试使用python读取java反序列化文件,并转换为Json格式以方便阅读(其实没多少用,还是一样难懂)。json定义反序列化,随意编辑反序列化流,并通过json生成序列化文件。缩小某些payload工具的大小,生成一个exp需要N多依...

weixin_32701893的博客 351

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

python json序列化对象_Python实现JSON反序列化类对象的示例

我们的网络协议一般是把数据转换成JSON之后再传输。之前在Java里面,实现序列化和反序列化,不管是 jackson ,还是 fastjson 都非常的简单。现在有项目需要用Python来开发,很自然的希望这样的便利也能在Python中体现。但是在网上看了一些教程,讲反序列化的时候,基本都是转换为 dict 或者 array 。这种编程方式我从情感上是无法接受的。难道是这些JSON库都不支持反序列...

weixin_39767124的博客 157

JSON使用ObjectCreationHandling 反序列化替换不重复的值

1.首先创建一个实例对象City,并声明构造函数. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace JSONDemo { public class City { public string Countr

lovegonghui的专栏 1378

JSON/JSONObject/JSONArray在反序列化时的区别

FastJSON2的使用体验

ThinkStu的博客 6270

JSON序列化和反序列化

1、什么是json序列化和反序列化? json序列化:就是JavaBean对象转化为JSON格式的字符串。 反序列化:就是序列化的反方向,将字符串转化为JavaBean。 2、为什么要序列化和反序列化? 现在比较流行前后端分离的项目,前后端分离就离不开传递数据,一种好的数据表示形式让开发者和网站能轻易识别是很重要的,而这个数据表示形式就是json。这时候问题又来了,前端要json字符串,后端要javaBean对象(假设后端采用java语言)怎么办?此时就需要json的序列化和反序列化了。 3、流行的类库 j

java知识整理 1万+

如何在Python中进行JSON数据的序列化和反序列化?

自定义编码器#自定义解码器returndct#创建一个Contact对象contact=Contact("赵六","1234567890")#序列化Contact对象#反序列化JSON字符串为Contact对象「输出结果:」"name":"赵六",赵六1234567890「解释:」:自定义编码器,继承自,并重写了default方法来处理Contact类的对象。:自定义解码器,用于将JSON对象转换为Contact类的对象。

wang15510689957的博客 2870

使用Jackson库进行JSON序列化和反序列化

JSON序列化是将Java对象转换为JSON字符串的过程。在JSON序列化过程中,Java对象的属性将被转换为JSON对象的键值对,如果Java对象包含其他Java对象或集合,这些嵌套对象也会被转换为嵌套的JSON对象和JSON数组。JSON反序列化是将JSON字符串转换为Java对象的过程。在JSON反序列化过程中,JSON对象的键值对将被转换为Java对象的属性,如果JSON对象包含其他JSON对象或JSON数组,这些嵌套的JSON也会被转换为嵌套的Java对象和Java集合。

weixin_66196770的博客 3529

JavaScript JSON序列化和反序列化

JSON序列化指将JSON对象转换为JSON字符串。J实现方式有两种:一种是调用JSON对象内置的`stringify()`函数,一种是为对象自定义`toJSON()`函数。 JSON反序列化指将JSON字符串转换为JSON对象。实现方式有两种:一种是使用JSON对象内置的`parse()`函数,一种是使用`eval()`函数。

xiangxiongfly 8901

C#中Json序列化和反序列化总结

Json序列化和反序列化总结 JSON介绍1.什么是JSON?2.JSON基于两种结构:3.几种表现形式:4.序列化和反序列化的4中方式:JavaScriptSerializer类1.定义2.示例 JSON介绍 1.什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。 JSON采用完全独立于程序语言的文本格式。这些特性使JSON成为理想的数据交换语言。 2.JSON基于两种结构:

jia380_csdn的博客 1万+

JSON 序列化 反序列化

其实就是转换数据格式的过程。

weixin_61819056的博客 1736

C++中JSON序列化和反序列化的实现

介绍了 C++ 中使用 nlohmann/json 库实现 JSON 序列化与反序列化的完整方案,包括基础用法、嵌套对象支持、向后兼容处理及可选字段的健壮设计。

Charlee44的技术驿站 1410
上一篇: Mysql卸载以及安装
下一篇: Linux Free 命令
爱coding的同学
博客等级 码龄11年 719粉丝 302原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱coding的同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值