前言
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
说白了就是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
三个类
JSONArray和JSONObject继承JSON:
JSONArray和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
接口:
实现了Map接口
使用起来也很简单,跟使用Map
就没多大的区别(因为它底层实际上就是操作Map
),常用的方法:
getString(String key)
remove(Object key)
JSONObject有常用的Map方法
2.3 JSONArray
JSONArray则是JSON数组,JSON数组对象中存储的是一个个JSON对象,所以类中的方法主要用于直接操作JSON对象
实现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 }
反序列化结果:
反序列化
我们要改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}
序列化结果:
序列化
轻松将JSON字符串里边的字段改掉。
最后
总的来说,fastjson还是足够方便好用的,它的速度也很快,只是最近漏洞有点多。