一篇文章教你輕鬆使用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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...