一篇文章教你輕鬆使用fastjson

Java3y發表於2019-12-13

前言

只有光頭才能變強。

文字已收錄至我的GitHub精選文章,歡迎Stargithub.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

說白了就是JSON和Java物件互相轉換

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:

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)

三、實戰

從上面的簡單介紹我們已經可以知道了:

  • 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多篇原創技術文章、海量視訊資源、精美腦圖,關注即可獲取!

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

非常感謝人才們能看到這裡,如果這個文章寫得還不錯,覺得「三歪」我有點東西的話 求點贊 求關注️ 求分享? 求留言? 對暖男我來說真的 非常有用!!!

創作不易,各位的支援和認可,就是我創作的最大動力,我們下篇文章見!

相關文章