走進Java介面測試之fastjson指南
引言
在上文 走進Java介面測試之理解JSON和XML基礎 我們介紹了 JSON 的基礎知識,本文我們深入研究阿里巴巴的開源 JSON 解析庫 fastjson。
什麼是fastjson?
fastjson 是阿里巴巴的開源 JSON 解析庫,它可以解析 JSON 格式的字串,支援將 Java Bean 序列化為 JSON 字串,也可以從 JSON 字串反序列化到JavaBean。
截止2019/2/1:
-
Github Stars: 16434
-
Github Forks: 4661
GitHub:https://github.com/alibaba/fastjson/
fastjson的特點
速度快
fastjson 相對其他 JSON 庫的特點是快,從 2011 年 fastjson 釋出1.1.x版本之後,其效能從未被其他 Java 實現的 JSON 庫超越。
使用廣泛
fastjson 在阿里巴巴大規模使用,在數萬臺伺服器上部署,fastjson 在業界被廣泛接受。在 2012 年被開源中國評選為最受歡迎的國產開源軟體之一。
測試完備
fastjson 有非常多的 testcase,在1.2.11版本中,testcase 超過3321個。每次釋出都會進行迴歸測試,保證質量穩定。
使用簡單
fastjson 的 API 十分簡潔。
功能完備
支援泛型,支援流處理超大文字,支援列舉,支援序列化和反序列化擴充套件。
fastjson使用
Maven配置
為了開始使用FastJson,我們首先需要將它新增到我們的 pom.xml
將Java物件轉換為JSON格式
讓我們定義以下Person Java bean
我們可以使用 JSON.toJSONString() 將 Java 物件轉換為 JSON 字串
這是結果:
我們還可以進一步開始自定義輸出並控制排序,日期格式或序列化標誌等內容。 例如 - 讓我們更新 bean 並新增幾個欄位:
-
}
以下是我們可以與 @JSONField 註解一起使用的最基本引數列表,以便自定義轉換過程:
-
引數格 format 用於正確格式化日期屬性
-
預設情況下,fastjson 庫完全序列化Java bean,但我們可以使用引數 -serialize 來忽略特定欄位的序列化
-
引數 ordinal 用於指定欄位順序
這是新的輸出:
fastjson 還支援非常有趣的 BeanToArray 序列化功能:
這是在這種情況下輸出的樣子:
完整示例:
建立JSON物件
與其他 JSON 庫一樣,從頭開始建立 JSON 物件非常簡單,只需要組合JSONObject 和 JSONArray 物件:
以下是輸出結果:
將JSON字串解析為Java物件
現在我們知道如何從頭開始建立 JSON 物件,以及如何將 Java 物件轉換為它們的 JSON 格式,讓我們把重點放在如何解析 JSON 格式上:
我們可以使用 JSON.parseObject() 從 JSON 字串中獲取 Java 物件。 請注意,如果已經聲明瞭自己的引數化建構函式,則必須定義 no-args 或預設建構函式,否則將丟擲 com.alibaba.fastjson.JSONException 。
這是新建立的物件。
使用ContextValueFilter配置JSON轉換
在某些情況下,我們可能需要更多地控制從 Java 物件到 JSON 格式的轉換過程。 在這種情況下,我們可以使用 ContextValueFilter 物件對轉換流應用其他過濾和自定義處理:
在這個例子中,我們隱藏了 DATE OF BIRTH 欄位,通過強制一個常量值,我們也忽略了所有不是 John 或 Doe 的欄位:
正如你所看到的,這是一個非常基本的示例,當然可以在更復雜的測試場景中使用相同的概念 - 結合 fastjson 在實際專案中提供的這些功能強大且輕量級的工具集。
使用NameFilter和SerializeConfig
fastjson 提供了一組工具來在處理任意物件時自定義 JSON 操作 - 我們沒有原始碼的物件。
讓我們假設我們有一個最初在本文中宣告的 Person Java bean 的編譯版本,我們需要對欄位命名和基本格式進行一些增強:
我們使用 NameFilter 匿名類聲明瞭 formatName 過濾器來處理欄位名稱。新建立的過濾器與 Person 類相關聯,然後新增到全域性例項 - 它基本上是 SerializeConfig 類中的靜態屬性。 現在我們可以輕鬆地將物件轉換為 JSON 格式,如本文前面所示。
請注意,我們使用了 toJSONStringWithDateFormat() 而不是 toJSONString() 來快速在日期欄位上應用相同的格式規則。
這是輸出:
如你所見 - 欄位名稱已更改,日期值確實已正確格式化。
將 SerializeFilter 與 ContextValueFilter 相結合可以完全控制任意和複雜Java 物件的轉換過程。
小結
在本文中,我們展示瞭如何使用 fastjson 將Javabean 轉換成 JSON 字串,以及如何反過來。我們還展示瞭如何使用 fastjson 的一些核心特性來定製 JSON 輸出。 fastjson庫提供了一個相對簡單但仍然非常強大的API, JSON.toJSONString 和 JSON.parseObject 可滿足大多數需求。