fastjson学习笔记

简介: JSON相信大家对他也不陌生了,前后端交互中常常就以JSON来进行数据交换。而有的时候,我们也会将JSON直接保存在数据库中。

前言


JSON相信大家对他也不陌生了,前后端交互中常常就以JSON来进行数据交换。而有的时候,我们也会将JSON直接保存在数据库中。

可能就有人不太理解,为什么要将JSON保存在关系型数据库中?

我在最开始的时候也有类似的疑惑,问了几个同事,得出的结论都差不多:方便扩展,如果那些字段不需要用到索引,改动比较频繁,你又不想改动表的结构,那就可以在数据库中存入JSON

虽说存JSON会方便扩展,但如果你的MySQL版本还是相对较低的话,想要用SQL查JSON里某个属性,还是比较麻烦的。

并且从数据库里边取出来也仅仅是一个String,而想要操作JSON里边的属性,自己写不太方便,所以就有fastjson给我们去用。

1.png

这篇文章简单讲讲fastjson的使用,希望对大家有帮助。如果有帮助,给我点个赞呀!


一、fastjson入门


以下内容参考官网来源:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN

它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean

2.png说白了就是JSON和Java对象互相转换

fastjson优点:速度快、使用广泛、使用简单、功能完备、测试完备(之前爆了很多漏洞,现在我司走发布流程都强制我们升级fastjson版本了),现在使用fastjson至少升级到1.2.60版本

速度快的原因:

1、自行编写类似StringBuilder的工具类SerializeWriter。

2、使用ThreadLocal来缓存buf。

3、使用asm避免反射

4、集成jdk实现的一些优化算法


二、使用fastjson


首先我们在pom文件中引入fastjson的依赖就好了:

1<dependency>
2    <groupId>com.alibaba</groupId>
3    <artifactId>fastjson</artifactId>
4    <version>x.x.x</version>
5</dependency>

fastjson的使用主要是三个对象:

  • JSON
  • JSONObject
  • JSONArray

3.png

                                          三个类

JSONArray和JSONObject继承JSON:

4.pngJSONArray和JSONObject继承JSON


2.1 JSON对象


JSON这个类主要用于转换

  • 将Java对象序列化为JSON字符串
  • 将JSON字符串反序列化为Java对象

所以,有三个方法我们用得特别多:

  • parseObject(String text, Classclazz)
  • parseArray(String text, Classclazz)
  • toJSONString(Object object)


2.2 JSONObject


JSON对象(JSONObject)中的数据都是以key-value形式出现,所以它实现了Map接口:

5.png

                                         实现了Map接口

使用起来也很简单,跟使用Map就没多大的区别(因为它底层实际上就是操作Map),常用的方法:

  • getString(String key)
  • remove(Object key)

6.jpg

                        JSONObject有常用的Map方法


2.3 JSONArray


JSONArray则是JSON数组,JSON数组对象中存储的是一个个JSON对象,所以类中的方法主要用于直接操作JSON对象

7.png

                                                  实现List接口

最常用的方法:

  • getJSONObject(int index)


三、实战


从上面的简单介绍我们已经可以知道了:

  • JSON用于将字符串反序列化为JavaBean和JavaBean序列化为JSON
  • JSONObject代表的是JSON对象,底层通过Map来操作,常用getString等方法来获取对应的值
  • JSONArray代表的是JSON对象数组,底层实际上是List,它用作于操作JSON对象

一般来说,我们从数据库拿到JSON数据以后,然后要对JSON进行修改。比如JSON串如下:

1{
 2    "formId": "{$formId}",
 3    "link": "www.java3y.com",
 4    "text": [{
 5        "name": "java3y",
 6        "label": "3y",
 7        "value": {
 8            "value": "{$tureName}",
 9            "color": "",
10            "emphasis": ""
11        }
12    }, {
13        "name": "java4y",
14        "label": "3y",
15        "value": {
16            "value": "{$title}",
17            "color": "",
18            "emphasis": ""
19        }
20    }, {
21        "name": "java5y",
22        "label": "5y",
23        "value": {
24            "value": "关注我的公众号,更多干货",
25            "color": "#ff0040",
26            "emphasis": ""
27        }
28    }],
29    "yyyImg": "",
30    "yyyAge": "",
31    "pagepath": ""
32}

我们是不会直接操作JSON的,我们会将JSON转成我们自己的JavaBean,再操作JavaBean,最后序列化为JSONString

从上面的JSON结构上来看还是相对复杂的,思路:

  • 我们可以根据JSON的结构构建对应的JavaBean
  • 使用JSON类将JSON字符串反序列化为JavaBean
  • 修改JavaBean的值
  • 最后将JavaBean序列化为JSON字符串

从上面的JSON结构,首先我们针对text这层抽象为一个JavaBean。(实际上最里层的结构是value,但我这边不需要处理value,所以就不抽象了)

1/**
 2 * "name": "java3y",
 3 *     "label": "3y",
 4 *     "value": {
 5 *         "value": "{$tureName}",
 6 *         "color": "",
 7 *         "emphasis": ""
 8 *    }
 9 *
10 *  对Text进行抽象
11 */
12public class TextInfo {
13
14    private String name;
15    private String label;
16
17    // 因为value我这边不需要操作,所以就不抽象了,如果每层都要处理,那就得抽象
18    private Object value;
19
20
21    // set get ... 省略 欢迎关注我的公众号:Javay
22
23}

然后对外层进行抽象:

1public class ContentValue {
 2    private String formId;
 3    private String link;
 4    // 这里是一个数组,我们就抽象为List,属性名为text
 5    private List<TextInfo> text;
 6
 7    private String yyyImg;
 8    private String yyyAge;
 9    private String pagepath;
10
11    // set get ... 省略 欢迎关注我的公众号:Javay
12
13}

我们反序列化看一下:

1public static void main(String[] args) {
 2
 3    // JSON 字符串
 4    String s = "{\"formId\":\"{$formId}\",\"link\":\"www.java3y.com\",\"text\":[{\"name\":\"java3y\",\"label\":\"3y\",\"value\":{\"value\":\"{$tureName}\",\"color\":\"\",\"emphasis\":\"\"}},{\"name\":\"java4y\",\"label\":\"3y\",\"value\":{\"value\":\"{$title}\",\"color\":\"\",\"emphasis\":\"\"}},{\"name\":\"java5y\",\"label\":\"5y\",\"value\":{\"value\":\"关注我的公众号,更多干货\",\"color\":\"#ff0040\",\"emphasis\":\"\"}}],\"yyyImg\":\"\",\"yyyAge\":\"\",\"pagepath\":\"\"}";
 5
 6    // 使用JSON对象 将JSON字符串反序列化为JavaBean
 7    ContentValue contentValue = JSON.parse(s, ContentValue.class);
 8    System.out.println(contentValue);
 9
10
11    }

反序列化结果:

8.jpg

                                                     反序列化

我们要改text里边的值,只需要操作JavaBean就好了:

1public static void main(String[] args) {
 2
 3    // JSON 字符串
 4    String s = "{\"formId\":\"{$formId}\",\"link\":\"www.java3y.com\",\"text\":[{\"name\":\"java3y\",\"label\":\"3y\",\"value\":{\"value\":\"{$tureName}\",\"color\":\"\",\"emphasis\":\"\"}},{\"name\":\"java4y\",\"label\":\"3y\",\"value\":{\"value\":\"{$title}\",\"color\":\"\",\"emphasis\":\"\"}},{\"name\":\"java5y\",\"label\":\"5y\",\"value\":{\"value\":\"关注我的公众号,更多干货\",\"color\":\"#ff0040\",\"emphasis\":\"\"}}],\"yyyImg\":\"\",\"yyyAge\":\"\",\"pagepath\":\"\"}";
 5
 6    // 使用JSON对象 将JSON字符串反序列化为JavaBean
 7    ContentValue contentValue = JSON.parse(s, ContentValue.class);
 8    List<TextInfo> text = contentValue.getText();
 9    for (TextInfo textInfo : text) {
10        textInfo.setName("Java3y");
11        textInfo.setLabel("关注我的公众号呗");
12    }
13
14
15    // 修改后,反序列化回去
16    String content = JSON.toJSONString(contentValue);
17}

序列化结果:

9.jpg                                              序列化

轻松将JSON字符串里边的字段改掉。


最后


总的来说,fastjson还是足够方便好用的,它的速度也很快,只是最近漏洞有点多。

目录
相关文章
|
Linux 编译器 程序员
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
【Linux 调试秘籍】深入探索 C++:运行时获取堆栈信息和源代码行数的终极指南
1141 0
|
SQL 存储 分布式计算
Spark Doris Connector设计方案
Spark Doris Connector 是Doris在0.12版本中推出的新功能。用户可以使用该功能,直接通过Spark对Doris中存储的数据进行读写,支持SQL、Dataframe、RDD等方式。从Doris角度看,将其数据引入Spark,可以使用Spark一系列丰富的生态产品,拓宽了产品的想象力,也使得Doris和其他数据源的联合查询成为可能。
1127 0
Spark Doris Connector设计方案
|
SQL 监控 安全
网络安全中的安全漏洞管理与修复:技术深度剖析
【7月更文挑战第8天】安全漏洞的管理与修复是网络安全工作的重要组成部分。通过定期的安全审计、更新与补丁管理、漏洞扫描与评估、及时修复及持续监控与响应等措施,可以有效提升网络系统的安全性。然而,网络安全是一项长期而艰巨的任务,需要不断关注最新的安全动态和技术发展,持续优化安全策略和管理流程,以应对日益复杂的网络安全挑战。
|
10月前
|
机器学习/深度学习 人工智能 分布式计算
【AI系统】混合并行
混合并行融合了数据并行、模型并行和流水线并行,旨在高效利用计算资源,尤其适合大规模深度学习模型训练。通过将模型和数据合理分配至多个设备,混合并行不仅提升了计算效率,还优化了内存使用,使得在有限的硬件条件下也能处理超大型模型。3D混合并行(DP+PP+TP)是最先进的形式,需至少8个GPU实现。此策略通过拓扑感知3D映射最大化计算效率,减少通信开销,是当前深度学习训练框架如Deepspeed和Colossal AI的核心技术之一。
443 15
【AI系统】混合并行
|
9月前
|
JavaScript Java C#
【Typora-markdown语言】使用说明【指南】
Typora-markdown语言的使用说明和常见用法,好用的做笔记的工具软件及使用方法指南。目录 一、标题 二、段落 1、换行 2、分割线 三、文字显示 1、字体 2、上下标 四、列表 1、无序列表 2、无序列表 3、任务列表 五、区块显示 六、代码显示 1、行内代码 2、代码块 七、链接 八、脚注 九、图片插入 十、表格 十一、表情符号 语法: #(一级标题)##(二级标题)###(三级标题)。。。快捷键: Ctrl+数字1~6可以快速将选中的文本调成对
228 9
|
数据挖掘 API 数据处理
Python实现简易股票交易系统
Python实现简易股票交易系统
601 1
|
机器学习/深度学习 人工智能 自然语言处理
【AI大模型】LLM主流开源大模型介绍
【AI大模型】LLM主流开源大模型介绍
|
机器学习/深度学习 人工智能 自然语言处理
NLP技术
【7月更文挑战第8天】NLP技术
503 2
|
消息中间件 前端开发 JavaScript
JavaScript 线程:处理高并发任务的必备知识(下)
JavaScript 线程:处理高并发任务的必备知识(下)
JavaScript 线程:处理高并发任务的必备知识(下)
|
XML 缓存 Java
Spring5源码(7)-lookup-method和replace-method注入
Spring5源码(7)-lookup-method和replace-method注入
245 0