只有光头才能变强。java
文本已收录至个人GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3ygit
JSON
相信你们对他也不陌生了,先后端交互中经常就以JSON
来进行数据交换。而有的时候,咱们也会将JSON
直接保存在数据库中。github
可能就有人不太理解,为何要将JSON保存在关系型数据库中?算法
我在最开始的时候也有相似的疑惑,问了几个同事,得出的结论都差很少:方便扩展,若是那些字段不须要用到索引,改动比较频繁,你又不想改动表的结构,那就能够在数据库中存入JSON
数据库
虽然说存JSON
会方便扩展,但若是你的MySQL
版本仍是相对较低的话,想要用SQL查JSON
里某个属性,仍是比较麻烦的。json
而且从数据库里边取出来也仅仅是一个String
,而想要操做JSON
里边的属性,本身写不太方便,因此就有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
版本
速度快的缘由:
一、自行编写相似StringBuilder的工具类SerializeWriter。
二、使用ThreadLocal来缓存buf。
三、使用asm避免反射
四、集成jdk实现的一些优化算法
首先咱们在pom
文件中引入fastjson
的依赖就行了:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>x.x.x</version> </dependency>
fastjson
的使用主要是三个对象:
三个类
JSONArray和JSONObject继承JSON:
JSONArray和JSONObject继承JSON
JSON这个类主要用于转换:
因此,有三个方法咱们用得特别多:
parseObject(String text, Class clazz)
parseArray(String text, Class clazz)
toJSONString(Object object)
JSON对象(JSONObject)中的数据都是以key-value
形式出现,因此它实现了Map
接口:
实现了Map接口
使用起来也很简单,跟使用Map
就没多大的区别(由于它底层实际上就是操做Map
),经常使用的方法:
getString(String key)
remove(Object key)
JSONObject有经常使用的Map方法
JSONArray则是JSON数组,JSON数组对象中存储的是一个个JSON对象,因此类中的方法主要用于直接操做JSON对象
实现List接口
最经常使用的方法:
getJSONObject(int index)
从上面的简单介绍咱们已经能够知道了:
getString
等方法来获取对应的值通常来讲,咱们从数据库拿到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
的结构构建对应的JavaBeanJSON
类将JSON字符串反序列化为JavaBeanJavaBean
序列化为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多篇原创技术文章、海量视频资源、精美脑图,关注便可获取!
转发到朋友圈是对我最大的支持!
很是感谢人才们能看到这里,若是这个文章写得还不错,以为「三歪」我有点东西的话 求点赞 求关注️ 求分享👥 求留言💬 对暖男我来讲真的 很是有用!!!
创做不易,各位的支持和承认,就是我创做的最大动力,咱们下篇文章见!