深入理解fastjson

一、 簡介

Fastjson是一個Java語言編寫的高性能功能完善的JSON庫。它主要面向Java開發領域,能夠將Java對象序列化為JSON對象,同時也能將JSON對象反序列化為Java對象。它的速度比其他JSON庫更快,而且十分輕量級。Fastjson的功能非常強大,它為使用者提供了非常多的API,可以隨心所欲地進行序列化和反序列化操作,滿足了各種需求。以下是fastjson的一些常見功能和實現方法。

二、 序列化與反序列化

fastjson支持將Java對象直接序列化為JSON字元串,同時也可以把JSON字元串反序列化為Java對象。下面就以一個簡單的POJO對象為例,在Java代碼中,使用fastjson進行對象轉JSON格式操作,並且把轉換後的字元串再轉回對象。

public class Person {
    private String name;
    private int age;
    // getter、setter、toString方法省略
}

Person person = new Person();
person.setName("Tom");
person.setAge(20);

// 將Java對象轉換為JSON字元串
String jsonStr = JSON.toJSONString(person);
System.out.println(jsonStr);

// 將JSON字元串轉換為Java對象
Person person2 = JSON.parseObject(jsonStr, Person.class);
System.out.println(person2.getName() + " " + person2.getAge());

上述代碼中,我們定義了一個簡單的Java對象Person,並給它設置了name和age屬性的值,接著將該對象轉換為JSON格式的字元串,並將該字元串再次轉換為Java對象,在轉換時使用了parseObject()方法,這個方法會返回Person類的一個實例。這樣我們就實現了Java對象和JSON字元串的相互轉換。

三、 高級序列化選項

fastjson還支持更高級別的序列化控制,例如在序列化時列印出null值、保留小數點後幾位等等。下面是一些高級序列化選項的例子:

// 列印null值的屬性
Person person = new Person();
person.setName(null);
String jsonStr = JSON.toJSONString(person, SerializerFeature.WriteMapNullValue);
System.out.println(jsonStr);

// 保留小數點後兩位
double pi = 3.1415926;
String str = JSON.toJSONString(pi, SerializerFeature.BrowserCompatible);
System.out.println(str);

上述代碼中,我們使用了SerializerFeature枚舉類的一些常量來設置序列化選項,例如WriteMapNullValue常量表示序列化時輸出null值的屬性,BrowserCompatible常量表示保留小數點後兩位。

四、 JSON格式化輸出

fastjson不僅可以進行Java對象和JSON字元串之間的轉換,還可以將JSON字元串進行格式化輸出,使得輸出結果更加美觀易讀。下面是一個JSON字元串的例子:

{"name":"Tom","age":20,"books":["Java從入門到精通","數據結構與演算法"],"hobbies":[{"name":"basketball","level":"high"},{"name":"ping-pong","level":"middle"}]}

使用fastjson提供的功能可以把該JSON字元串輸出為下面格式的形式:

{
    "name": "Tom",
    "age": 20,
    "books": [
        "Java從入門到精通",
        "數據結構與演算法"
    ],
    "hobbies": [
        {
            "name": "basketball",
            "level": "high"
        },
        {
            "name": "ping-pong",
            "level": "middle"
        }
    ]
}

下面是輸出格式化的代碼:

String jsonStr = "{\"name\":\"Tom\",\"age\":20,\"books\":[\"Java從入門到精通\",\"數據結構與演算法\"],\"hobbies\":[{\"name\":\"basketball\",\"level\":\"high\"},{\"name\":\"ping-pong\",\"level\":\"middle\"}]}";
Object jsonObject = new JSONTokener(jsonStr).nextValue();
String formattedStr = JSON.toJSONString(jsonObject, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue,SerializerFeature.WriteDateUseDateFormat);
System.out.println(formattedStr);

上述代碼中,我們首先定義了一個JSON字元串,將它通過JSONTokener類進行解析,再使用JSON.toJSONString()方法將解析得到的JSON對象格式化輸出。

五、 JSON反序列化控制

fastjson從JSON字元串反序列化為Java對象時,我們可以控制反序列化的行為。例如,我們可以指定要忽略某些屬性、處理屬性名稱不一致的情況等等。下面是一些反序列化選項的例子:

// 忽略已知不需要的屬性
String jsonString = "{\"id\":1001,\"name\":\"Tom\",\"gender\":\"male\",\"height\":170}";
Person person = JSON.parseObject(jsonString, Person.class, new PropertyFilter() {
    public boolean apply(Object source, String name, Object value) {
        if ("height".equals(name)) { // 忽略屬性height
            return false;
        }
        return true; // 不忽略其他屬性
    }
});
System.out.println(person);

// 把屬性名字不同的字元串屬性與Java屬性映射
String jsonString = "{\"name\":\"Tom\",\"person_age\":20}";
Map mappings = new HashMap();
mappings.put("age", "person_age"); // 把age屬性名映射成person_age
Person person = JSON.parseObject(jsonString, Person.class, new PropertyNamingStrategy(){
    public String translate(String propertyName) {
        if (mappings.containsKey(propertyName)) {
            return mappings.get(propertyName);
        }
        // 如果沒有映射關係,則按照默認規則轉換屬性名稱
        return propertyName;
    }
});
System.out.println(person);

上述代碼中,我們使用了PropertyFilter和PropertyNamingStrategy兩個介面來控制反序列化行為。PropertyFilter可以過濾掉不需要序列化的屬性,而PropertyNamingStrategy可以將屬性名映射成不同的名稱。

六、 性能提升

fastjson是一個高性能的JSON庫,但是我們可以通過一些措施來進一步提升它的性能。下面是一些提升fastjson性能的技巧:

6.1 使用asm庫

ASM是一個Java位元組碼操縱庫,可以直接編輯Java位元組碼來實現優化。由於fastjson是通過動態生成Java代碼來實現JSON轉換,因此使用ASM庫可以進一步提升fastjson的性能。可以通過在引入fastjson的pom.xml文件中加入ASM庫的依賴來實現:

<dependency>
    <groupId>org.ow2.asm</groupId>
    <artifactId>asm</artifactId>
    <version>9.0</version>
</dependency>

6.2 禁用setAccessible()

fastjson在進行反射操作時,首先會通過setAccessible()方法來打開Java對象的私有成員訪問許可權,以便能夠操作私有成員。但是這個方法會消耗很多的時間,而且也存在安全問題,因此可以通過禁用這個方法來進一步提升fastjson的性能。

ParserConfig.getGlobalInstance().setAutoTypeSupport(true); //設置為true時,便禁用了setAccessible()的使用

6.3 壓縮JSON字元串

fastjson支持對JSON字元串進行壓縮,減小數據傳輸量和存儲空間的佔用。通過SerializerFeature.WriteSlashAsSpecial選項可以打開壓縮功能。

String jsonStr = "{\"name\":\"Tom\",\"age\":20}";
String compressedStr = JSON.toJSONString(jsonStr, SerializerFeature.WriteSlashAsSpecial);
System.out.println(compressedStr); // 輸出:{"name":"Tom","age":20}

七、 結論

fastjson是一款高性能完善的JSON庫,它的功能非常強大,為使用者提供了很多API,可以隨心所欲地進行序列化和反序列化操作。在實際應用中,我們可以通過設置序列化選項和反序列化控制來滿足各種需求,同時還可以通過一些技巧進一步提升它的性能。

原創文章,作者:ZXSGK,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/360512.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ZXSGK的頭像ZXSGK
上一篇 2025-02-24 00:33
下一篇 2025-02-24 00:33

相關推薦

  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟體,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 深入剖析MapStruct未生成實現類問題

    一、MapStruct簡介 MapStruct是一個Java bean映射器,它通過註解和代碼生成來在Java bean之間轉換成本類代碼,實現類型安全,簡單而不失靈活。 作為一個…

    編程 2025-04-25
  • 深入理解Python字元串r

    一、r字元串的基本概念 r字元串(raw字元串)是指在Python中,以字母r為前綴的字元串。r字元串中的反斜杠(\)不會被轉義,而是被當作普通字元處理,這使得r字元串可以非常方便…

    編程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一個程序就是一個模塊,而一個模塊可以引入另一個模塊,這樣就形成了包。包就是有多個模塊組成的一個大模塊,也可以看做是一個文件夾。包可以有效地組織代碼和數據…

    編程 2025-04-25
  • 深入探討馮諾依曼原理

    一、原理概述 馮諾依曼原理,又稱「存儲程序控制原理」,是指計算機的程序和數據都存儲在同一個存儲器中,並且通過一個統一的匯流排來傳輸數據。這個原理的提出,是計算機科學發展中的重大進展,…

    編程 2025-04-25

發表回復

登錄後才能評論