只有光頭才能變強。java
文本已收錄至個人GitHub精選文章,歡迎Star:github.com/ZhongFuChen…git
JSON
相信你們對他也不陌生了,先後端交互中經常就以JSON
來進行數據交換。而有的時候,咱們也會將JSON
直接保存在數據庫中。github
可能就有人不太理解,爲何要將JSON保存在關係型數據庫中?算法
我在最開始的時候也有相似的疑惑,問了幾個同事,得出的結論都差很少:方便擴展,若是那些字段不須要用到索引,改動比較頻繁,你又不想改動表的結構,那就能夠在數據庫中存入JSON
數據庫
雖然說存JSON
會方便擴展,但若是你的MySQL
版本仍是相對較低的話,想要用SQL查JSON
裏某個屬性,仍是比較麻煩的。json
而且從數據庫裏邊取出來也僅僅是一個String
,而想要操做JSON
裏邊的屬性,本身寫不太方便,因此就有fastjson
給咱們去用。後端
這篇文章簡單講講fastjson
的使用,但願對你們有幫助。若是有幫助,給我點個贊呀!數組
如下內容來源:github.com/alibaba/fas…緩存
它能夠解析JSON
格式的字符串,支持將Java Bean
序列化爲JSON
字符串,也能夠從JSON
字符串反序列化到JavaBean
工具
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:
JSON這個類主要用於轉換:
因此,有三個方法咱們用得特別多:
parseObject(String text, Class<T> clazz)
parseArray(String text, Class<T> clazz)
toJSONString(Object object)
JSON對象(JSONObject)中的數據都是以key-value
形式出現,因此它實現了Map
接口:
使用起來也很簡單,跟使用Map
就沒多大的區別(由於它底層實際上就是操做Map
),經常使用的方法:
getString(String key)
remove(Object key)
JSONArray則是JSON數組,JSON數組對象中存儲的是一個個JSON對象,因此類中的方法主要用於直接操做JSON對象
最經常使用的方法:
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:github.com/ZhongFuChen…
樂於輸出乾貨的Java技術公衆號:Java3y。公衆號內有300多篇原創技術文章、海量視頻資源、精美腦圖,關注便可獲取!
很是感謝人才們能看到這裏,若是這個文章寫得還不錯,以爲「三歪」我有點東西的話 求點贊 求關注️ 求分享👥 求留言💬 對暖男我來講真的 很是有用!!!
創做不易,各位的支持和承認,就是我創做的最大動力,咱們下篇文章見!