前言
只有光頭才能變強。
文字已收錄至我的GitHub精選文章,歡迎Star:github.com/ZhongFuChen…
JSON
相信大家對他也不陌生了,前後端互動中常常就以JSON
來進行資料交換。而有的時候,我們也會將JSON
直接儲存在資料庫中。
可能就有人不太理解,為什麼要將JSON儲存在關係型資料庫中?
我在最開始的時候也有類似的疑惑,問了幾個同事,得出的結論都差不多:方便擴充套件,如果那些欄位不需要用到索引,改動比較頻繁,你又不想改動表的結構,那就可以在資料庫中存入JSON
雖說存JSON
會方便擴充套件,但如果你的MySQL
版本還是相對較低的話,想要用SQL查JSON
裡某個屬性,還是比較麻煩的。
並且從資料庫裡邊取出來也僅僅是一個String
,而想要操作JSON
裡邊的屬性,自己寫不太方便,所以就有fastjson
給我們去用。
這篇文章簡單講講fastjson
的使用,希望對大家有幫助。如果有幫助,給我點個贊呀!
一、fastjson入門
以下內容來源:github.com/alibaba/fas…
它可以解析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:github.com/ZhongFuChen…
樂於輸出乾貨的Java技術公眾號:Java3y。公眾號內有300多篇原創技術文章、海量視訊資源、精美腦圖,關注即可獲取!
非常感謝人才們能看到這裡,如果這個文章寫得還不錯,覺得「三歪」我有點東西的話 求點贊 求關注️ 求分享? 求留言? 對暖男我來說真的 非常有用!!!
創作不易,各位的支援和認可,就是我創作的最大動力,我們下篇文章見!