一篇文章教你輕鬆使用fastjson

来源:https://www.cnblogs.com/Java3y/archive/2019/12/13/12036772.html
-Advertisement-
Play Games

前言 只有光頭才能變強。 文本已收錄至我的GitHub精選文章,歡迎Star : "https://github.com/ZhongFuCheng3y/3y" 相信大家對他也不陌生了,前後端交互中常常就以 來進行 數據交換 。而有的時候,我們也會將 直接保存在資料庫中。 可能就有人不太理解,為什麼要 ...


前言

只有光頭才能變強。

文本已收錄至我的GitHub精選文章,歡迎Starhttps://github.com/ZhongFuCheng3y/3y

JSON相信大家對他也不陌生了,前後端交互中常常就以JSON來進行數據交換。而有的時候,我們也會將JSON直接保存在資料庫中。

可能就有人不太理解,為什麼要將JSON保存在關係型資料庫中?

我在最開始的時候也有類似的疑惑,問了幾個同事,得出的結論都差不多:方便擴展,如果那些欄位不需要用到索引,改動比較頻繁,你又不想改動表的結構,那就可以在資料庫中存入JSON

雖說存JSON會方便擴展,但如果你的MySQL版本還是相對較低的話,想要用SQL查JSON里某個屬性,還是比較麻煩的。

並且從資料庫裡邊取出來也僅僅是一個String,而想要操作JSON裡邊的屬性,自己寫不太方便,所以就有fastjson給我們去用。

預覽知識點

這篇文章簡單講講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版本

速度快的原因:

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精選文章,歡迎Starhttps://github.com/ZhongFuCheng3y/3y

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

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

非常感謝人才們能看到這裡,如果這個文章寫得還不錯,覺得「三歪」我有點東西的話 求點贊 求關註️ 求分享

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、 前言 作為一枚程式員,你肯定對IntelliJ IDEA這個工具一點也不陌生!或許你沒有用過,但你也一定聽說過。作為在業界被公認為最好的java開發工具,IDEA每次大版本更新都備受矚目。劃重點,IntelliJ IDEA 2019.3現已發佈! 近期,我也是從2019.2版本升級到了2019 ...
  • 1 # coding:utf-8 2 3 4 class Animal(object): 5 def __init__(self): 6 self._name = None 7 self._f = None 8 9 def eat(self): 10 print("%s吃%s" % (self._n ...
  • 1 class Cat(Animal): 2 def __init__(self): 3 import warnings 4 warnings.warn("Cat類帶刪除線了", DeprecationWarning) 5 6 def run(self): 7 import warnings 8 w... ...
  • 有時候會遇到這種情況,某些屬性指向限制在特定範圍內,當別人調用的時候,只能賦值在這特定範圍內的值。這樣的情況有哪些呢?比如有一個屬性是用來放年齡的,那麼這個年齡就不能被設置為負數。還有人的性別隻有男跟女兩種選擇,別來一個雌雄同體。在這樣的情況下,就會用到封裝跟隱藏。 信息的封裝和隱藏 Java中通過 ...
  • 關閉防火牆,設置虛擬機和本機在同一網段,還是ping不同 解決方法:在VMware中點擊 編輯 >虛擬網路編輯器 >更改設置 >還原預設設置 然後重新配置虛擬機和本機在同一網段,關閉VMnet1,啟動VMnet8 ...
  • 軟體包:類似於電腦的文件管理方式,主要解決同名文件。 包幫助管理大型軟體系統:將語義類似的類組織到包中;解決類命名衝突的問題。 包可以包含類和子包。 關鍵字——package package語句作為Java源文件的第一條語句,指明該文件中定義的類所在的包。若預設該語句,則指定為無名包。 格式:pac ...
  • 目錄結構: —|controller —|Home.php —|model —|view —|welcome.php —|index.php 基本原理: 首頁 index.php 通過獲得地址欄中的路由名稱獲得對應控制器以及控制的方法名,通過require引入到index.php首頁中。通過引入的對 ...
  • 重載的概念 在同一個類中,允許存在一個以上的同名的方法,只要它們的參數個數或者參數類型不同的話就行。 重載的特點 與返回值類型無關,只看參數列表,且參數列表必須不同。(參數個數、參數類型、參數排列順序) 理解:就只要參數列表不要完全一樣就行。和返回值類型無關。 方法的可變個數的形參 在遇到不知道要給 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...