一篇文章教你輕鬆使用fastjson

前言

只有光頭才能變強。java

文本已收錄至個人GitHub精選文章,歡迎Stargithub.com/ZhongFuChen…git

JSON相信你們對他也不陌生了,先後端交互中經常就以JSON來進行數據交換。而有的時候,咱們也會將JSON直接保存在數據庫中。github

可能就有人不太理解,爲何要將JSON保存在關係型數據庫中?算法

我在最開始的時候也有相似的疑惑,問了幾個同事,得出的結論都差很少:方便擴展,若是那些字段不須要用到索引,改動比較頻繁,你又不想改動表的結構,那就能夠在數據庫中存入JSON數據庫

雖然說存JSON會方便擴展,但若是你的MySQL版本仍是相對較低的話,想要用SQL查JSON裏某個屬性,仍是比較麻煩的。json

而且從數據庫裏邊取出來也僅僅是一個String,而想要操做JSON裏邊的屬性,本身寫不太方便,因此就有fastjson給咱們去用。後端

預覽知識點

這篇文章簡單講講fastjson的使用,但願對你們有幫助。若是有幫助,給我點個贊呀!數組

1、fastjson入門

如下內容來源:github.com/alibaba/fas…緩存

它能夠解析JSON格式的字符串,支持將Java Bean序列化爲JSON字符串,也能夠從JSON字符串反序列化到JavaBean工具

說白了就是JSON和Java對象互相轉換

fastjson優勢:速度快、使用普遍、使用簡單、功能完備、測試完備(以前爆了不少漏洞,如今我司走發佈流程都強制咱們升級fastjson版本了),如今使用fastjson至少升級到1.2.60版本

速度快的緣由:

一、自行編寫相似StringBuilder的工具類SerializeWriter。

二、使用ThreadLocal來緩存buf。

三、使用asm避免反射

四、集成jdk實現的一些優化算法

2、使用fastjson

首先咱們在pom文件中引入fastjson的依賴就行了:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>x.x.x</version>
</dependency>
複製代碼

fastjson的使用主要是三個對象:

  • JSON
  • JSONObject
  • JSONArray

三個類

JSONArray和JSONObject繼承JSON:

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就沒多大的區別(由於它底層實際上就是操做Map),經常使用的方法:

  • getString(String key)
  • remove(Object key)

JSONObject有經常使用的Map方法

2.3 JSONArray

JSONArray則是JSON數組,JSON數組對象中存儲的是一個個JSON對象,因此類中的方法主要用於直接操做JSON對象

實現List接口

最經常使用的方法:

  • getJSONObject(int index)

3、實戰

從上面的簡單介紹咱們已經能夠知道了:

  • 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精選文章,歡迎Stargithub.com/ZhongFuChen…

樂於輸出乾貨的Java技術公衆號:Java3y。公衆號內有300多篇原創技術文章、海量視頻資源、精美腦圖,關注便可獲取!

轉發到朋友圈是對我最大的支持!

很是感謝人才們能看到這裏,若是這個文章寫得還不錯,以爲「三歪」我有點東西的話 求點贊 求關注️ 求分享👥 求留言💬 對暖男我來講真的 很是有用!!!

創做不易,各位的支持和承認,就是我創做的最大動力,咱們下篇文章見!

相關文章
相關標籤/搜索