一篇文章教你轻松使用fastjson
前言
只有光头才能变强。
文本已收录至我的github精选文章,欢迎star:https://github.com/zhongfucheng3y/3y
json
相信大家对他也不陌生了,前后端交互中常常就以json
来进行数据交换。而有的时候,我们也会将json
直接保存在数据库中。
可能就有人不太理解,为什么要将json保存在关系型数据库中?
我在最开始的时候也有类似的疑惑,问了几个同事,得出的结论都差不多:方便扩展,如果那些字段不需要用到索引,改动比较频繁,你又不想改动表的结构,那就可以在数据库中存入json
虽说存json
会方便扩展,但如果你的mysql
版本还是相对较低的话,想要用sql查json
里某个属性,还是比较麻烦的。
并且从数据库里边取出来也仅仅是一个string
,而想要操作json
里边的属性,自己写不太方便,所以就有fastjson
给我们去用。
这篇文章简单讲讲fastjson
的使用,希望对大家有帮助。如果有帮助,给我点个赞呀!
一、fastjson入门
以下内容来源:https://github.com/alibaba/fastjson/wiki/quick-start-cn
它可以解析json
格式的字符串,支持将java bean
序列化为json
字符串,也可以从json
字符串反序列化到javabean
fastjson
优点:速度快、使用广泛、使用简单、功能完备、测试完备(之前爆了很多漏洞,现在我司走发布流程都强制我们升级fastjson
版本了),现在使用fastjson
至少升级到1.2.60
版本
速度快的原因:
1、自行编写类似stringbuilder的工具类serializewriter。
2、使用threadlocal来缓存buf。
3、使用asm避免反射
4、集成jdk实现的一些优化算法
二、使用fastjson
首先我们在pom
文件中引入fastjson
的依赖就好了:
<dependency> <groupid>com.alibaba</groupid> <artifactid>fastjson</artifactid> <version>x.x.x</version> </dependency>
fastjson
的使用主要是三个对象:
- json
- jsonobject
- jsonarray
jsonarray和jsonobject继承json:
2.1 json对象
json这个类主要用于转换:
- 将java对象序列化为json字符串
- 将json字符串反序列化为java对象
所以,有三个方法我们用得特别多:
parseobject(string text, class<t> clazz)
parsearray(string text, class<t> clazz)
tojsonstring(object object)
2.2 jsonobject
json对象(jsonobject)中的数据都是以key-value
形式出现,所以它实现了map
接口:
使用起来也很简单,跟使用map
就没多大的区别(因为它底层实际上就是操作map
),常用的方法:
getstring(string key)
remove(object key)
2.3 jsonarray
jsonarray则是json数组,json数组对象中存储的是一个个json对象,所以类中的方法主要用于直接操作json对象
最常用的方法:
getjsonobject(int index)
## 三、实战
从上面的简单介绍我们已经可以知道了:
- json用于将字符串反序列化为javabean和javabean序列化为json
- jsonobject代表的是json对象,底层通过map来操作,常用
getstring
等方法来获取对应的值 - jsonarray代表的是json对象数组,底层实际上是list,它用作于操作json对象
一般来说,我们从数据库拿到json数据以后,然后要对json进行修改。比如json串如下:
{ "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": "" }
我们是不会直接操作json的,我们会将json转成我们自己的javabean,再操作javabean,最后序列化为jsonstring
从上面的json
结构上来看还是相对复杂的,思路:
- 我们可以根据
json
的结构构建对应的javabean - 使用
json
类将json字符串反序列化为javabean - 修改javabean的值
- 最后将
javabean
序列化为json字符串
从上面的json
结构,首先我们针对text
这层抽象为一个javabean。(实际上最里层的结构是value
,但我这边不需要处理value
,所以就不抽象了)
/** * "name": "java3y", * "label": "3y", * "value": { * "value": "{$turename}", * "color": "", * "emphasis": "" * } * * 对text进行抽象 */ public class textinfo { private string name; private string label; // 因为value我这边不需要操作,所以就不抽象了,如果每层都要处理,那就得抽象 private object value; // set get ... 省略 欢迎关注我的公众号:javay }
然后对外层进行抽象:
public class contentvalue { private string formid; private string link; // 这里是一个数组,我们就抽象为list,属性名为text private list<textinfo> text; private string yyyimg; private string yyyage; private string pagepath; // set get ... 省略 欢迎关注我的公众号:javay }
我们反序列化看一下:
public static void main(string[] args) { // json 字符串 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\":\"\"}"; // 使用json对象 将json字符串反序列化为javabean contentvalue contentvalue = json.parse(s, contentvalue.class); system.out.println(contentvalue); }
反序列化结果:
我们要改text里边的值,只需要操作javabean
就好了:
public static void main(string[] args) { // json 字符串 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\":\"\"}"; // 使用json对象 将json字符串反序列化为javabean contentvalue contentvalue = json.parse(s, contentvalue.class); list<textinfo> text = contentvalue.gettext(); for (textinfo textinfo : text) { textinfo.setname("java3y"); textinfo.setlabel("关注我的公众号呗"); } // 修改后,反序列化回去 string content = json.tojsonstring(contentvalue); }
序列化结果:
轻松将json字符串里边的字段改掉。
最后
总的来说,fastjson还是足够方便好用的,它的速度也很快,只是最近漏洞有点多。
本已收录至我的github精选文章,欢迎star:https://github.com/zhongfucheng3y/3y
乐于输出干货的java技术公众号:java3y。公众号内有300多篇原创技术文章、海量视频资源、精美脑图,关注即可获取!
非常感谢人才们能看到这里,如果这个文章写得还不错,觉得「三歪」我有点东西的话 求点赞 求关注️ 求分享
上一篇: 递归---Day29
下一篇: Python爬虫系列:五、正则表达式