androidjson反序列化,json 反序列化

本文目錄一覽:

如何在android中使用jackson做json序列化和反序列化

T data = null;

try {

ObjectMapper mapper = new ObjectMapper();

mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

data = mapper.readValue(jsonString, type);

} catch (IOException e) {

e.printStackTrace();

}

return data;

}

//對象轉為json字符串

public static String objectToJson(Object object) {

ObjectMapper m = new ObjectMapper();

m.configure(SerializationConfig.Feature.WRITE_NULL_PROPERTIES, false);

ObjectWriter ow = m.writer().withDefaultPrettyPrinter();

String message = “”;

try {

message = ow.writeValueAsString(object);

} catch (IOException e) {

如何:對 JSON 數據進行序列化和反序列化

主要用於存儲對象狀態為另一種通用格式,比如存儲為二進制、xml、json等等,把對象轉換成這種格式就叫序列化,而反序列化通常是從這種格式轉換回來。 使用序列化主要是因為跨平台和對象存儲的需求,因為網絡上只允許字符串或者二進制格式,而文…

Android Gson 使用詳解

Json 是一種文本形式的數據交換格式,比 xml 更為輕量。Json 的解析和生成的方式很多,在 Android 平台上最常用的類庫有 Gson 和 FastJson 兩種,這裡要介紹的是 Gson

Gson 的 GitHub 主頁點擊這裡: Gson

在進行序列化與反序列操作前,需要先實例化一個 com .google.gson.Gson 對象,獲取 Gson 對象的方法有兩種

利用 Gson 可以很方便地生成 Json 字符串,通過使用 addProperty 的四個重載方法

addProperty 方法底層調用的是 add(String property, JsonElement value) 方法,即將基本數據類型轉化為了 JsonElement 對象,JsonElement 是一個抽象類,而 JsonObject 繼承了 JsonElement ,因此我們可以通過 JsonObject 自己來構建一個 JsonElement

Json數組 與 字符串數組

Json數組 與 List

Gson 也提供了 toJson() 和 fromJson() 兩個方法用於轉化 Model 與 Json,前者實現了序列化,後者實現了反序列化

首先,聲明一個 User 類

序列化的方法很簡單,調用 gson 對象的 toJson 方法,傳入要序列化的對象

反序化的方式也類似

繼續使用上一節聲明的 User 類,根據 User 類聲明的各個屬性名,移動端的開發者希望接口返回的數據格式即是如下這樣的

如果沒有和服務器端溝通好或者是 API 改版了,接口返回的數據格式可能是這樣的

如果繼續使用上一節介紹的方法,那無疑會解析出錯

例如

name 屬性值解析不到,所以為 null

此時為了兼顧多種格式的數據,就需要使用 SerializedName 註解

根據 SerializedName 的聲明來看,SerializedName 包含兩個屬性值,一個是字符串,一個是字符串數組,而字符串數組含有默認值

SerializedName 的作用是為了在序列化或反序列化時,指導 Gson 如果將原有的屬性名和其它特殊情況下的屬性名聯繫起來

例如,修改 User 類,為 name 聲明 SerializedName 註解,註解值為 userName

在序列時,Json 格式就會相應改變

在反序列化時也一樣,能夠解析到正確的屬性值

還有個問題沒解決,為了應對多種屬性名不一致的情況,難道我們要聲明多個 User 類嗎?這顯然是不現實的,所以還需要為 User 類設置多個備選屬性名,這就需要用到 SerializedName 註解的另一個屬性值 alternate 了。

以下幾種情況都能夠被正確的反序列化

有時候並不是所有的字段都需要進行系列化和反序列化,因此需要對某些字段進行排除,有四種方法可以來實現這種需求。

Expose 註解包含兩個屬性值,且均聲明了默認值。Expose 的含義即為“暴露”,即用於對外暴露字段,serialize 用於指定是否進行序列化,deserialize 用於指定是否進行反序列化。如果字段不聲明 Expose 註解,則意味着不進行序列化和反序列化操作,相當於兩個屬性值均為 false 。此外,Expose 註解需要和 GsonBuilder 構建的 Gson 對象一起使用才能生效。

Expose 註解的註解值聲明情況有四種

現在來看個例子,修改 User 類

按照如上的註解值,只有聲明了 Expose 註解且 serialize 值為 true 的字段才能被序列化,只有聲明了 Expose 註解且 deserialize 值為 true 的字段才能被反序列化

Gson 提供了 @Since 和 @Until 兩個註解基於版本對字段進行過濾,@Since 和 @Until 都包含一個 Double 屬性值,用於設置版本號。Since 的意思是“自……開始”,Until 的意思是“到……為止”,一樣要和 GsonBuilder 配合使用。

當版本( GsonBuilder 設置的版本) 大於或等於 Since 屬性值或小於 Until 屬性值時字段會進行序列化和反序列化操作,而沒有聲明註解的字段都會加入序列化和反序列操作

現在來看個例子,修改 User 類

訪問修飾符由 java.lang.reflect.Modifier 提供 int 類型的定義,而 GsonBuilder 對象的 excludeFieldsWithModifiers 方法接收一個 int 類型可變參數,指定不進行序列化和反序列化操作的訪問修飾符字段

看個例子

GsonBuilder 類包含 setExclusionStrategies(ExclusionStrategy… strategies) 方法用於傳入不定長參數的策略方法,用於直接排除指定字段名或者指定字段類型

看個例子

字段名為 “intField” 和字段類型為 double 的字段都會被排除掉

setExclusionStrategies 方法在序列化和反序列化時都會生效,如果只是想指定其中一種情況下的排除策略或分別指定排除策略,可以改為使用以下兩個方法

對於 Gson 而言,在序列化時如果某個屬性值為 null 的話,那麼在序列化時該字段不會參與進來,如果想要顯示輸出該字段的話,可以通過 GsonBuilder 進行配置

默認的序列化後的 Josn 字符串並不太直觀,可以選擇格式化輸出

Gson 也可以對時間值進行格式化

TypeAdapter 是一個泛型抽象類,用於接管某種類型的序列化和反序列化過程,包含兩個抽象方法,分別用於自定義序列化和反序列化過程

下面看個簡單的例子

定義 TypeAdapter 的子類 UserTypeAdapter 來接管 User 類的序列化和反序列化過程

這裡設定當 User 類序列化時 Json 中的Key值都是大寫字母開頭,反序列化時支持“name”和“Name”兩種不同的 Json 風格

可以看到 User 類按照預定義的策略來完成序列化和反序列化了

TypeAdapter 將序列化和反序列操作都接管了過來,其實 Gson 還提供了只接管序列化過程的接口,即 JsonSerializer

看個例子

相對應的,JsonDeserializer 接口提供了反序列化的接口

這裡有個比較麻煩的地方,那就是在使用 TypeAdapter 、JsonSerializer 和 JsonDeserializer 時,總需要調用 registerTypeAdapter 方法進行註冊,那有沒有更簡單的註冊方法呢?

有的,Gosn 還提供了另一個註解 @JsonAdapter 用於進行簡單的聲明

類似於這樣,聲明了 User 類的序列化或反序列化操作由 UserTypeAdapter 完成,註解的優先級高於 registerTypeAdapter 方法

TypeAdapterFactory 是用於創建 TypeAdapter 的工廠類,通過參數 TypeToken 來查找確定對應的 TypeAdapter,如果沒有就返回 null 並由 Gson 默認的處理方法來進行序列化和反序列化操作,否則就由用戶預定義的 TypeAdapter 來進行處理

這一篇文章好像寫得太長了一點?Gson 的知識點介紹到這裡也差不多了,以後如果還發現新內容的話我會繼續補充,現在就先這樣啦

如何反序列化動態JSON

做ASP.NET開發的朋友應該會熟悉一個類——位於System.Web.Script.Serialization命名空間下的JavaScriptSerializer類。因為這個類是為Web開發服務的,其實可以用於整個.net框架,即你在WinForm、WPF等程序中依舊可以用。這個類的作用是將指定的JSON字符串進行序列化和反序列化,參與操作的類型可以是固定的,如果JSON是固定結構的,這樣就可行。而對於結構不固定的JSON,這個類可以以字典的形式進行操作, 即調用DeserializeObject方法後會返回一個Object類型的對象,實際上這個對象是實現了IDictionarystring, object接口的 ,這樣一來,反序列化的結果就可以作為字典來操作。如果JSON裡面有嵌套的對象,則返回的字典對象中會嵌套着字典對象。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/204291.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-07 12:16
下一篇 2024-12-07 12:16

相關推薦

  • 金額選擇性序列化

    本文將從多個方面對金額選擇性序列化進行詳細闡述,包括其定義、使用場景、實現方法等。 一、定義 金額選擇性序列化指根據傳入的金額值,選擇是否進行序列化,以達到減少數據傳輸的目的。在實…

    編程 2025-04-29
  • JSON的MD5

    在Web開發過程中,JSON(JavaScript Object Notation)是最常用的數據格式之一。MD5(Message-Digest Algorithm 5)是一種常用…

    編程 2025-04-29
  • 使用Java將JSON寫入HDFS

    本篇文章將從以下幾個方面詳細闡述Java將JSON寫入HDFS的方法: 一、HDFS簡介 首先,先來了解一下Hadoop分布式文件系統(HDFS)。HDFS是一個可擴展性高的分布式…

    編程 2025-04-29
  • 理解Java反序列化(Java Deserialization Vulnerability)

    本文將從多個方面深入探討Java反序列化漏洞,對於筆者所總結的經驗和教訓,以及掌握Java反序列化的設計模式、最佳實踐和防範措施。 一、Java反序列化漏洞概述 Java反序列化漏…

    編程 2025-04-28
  • 如何使用Newtonsoft datatable轉Json

    Newtonsoft DataTable 是一個基於.NET的JSON框架,也是一個用於序列化和反序列化JSON的強大工具。 在本文中,我們將學習如何使用Newtonsoft Da…

    編程 2025-04-28
  • JPRC – 輕鬆創建可讀性強的 JSON API

    本文將介紹一個全新的 JSON API 框架 JPRC,通過該框架,您可以輕鬆創建可讀性強的 JSON API,提高您的項目開發效率和代碼可維護性。接下來將從以下幾個方面對 JPR…

    編程 2025-04-27
  • Python存為JSON的方法及實例

    本文將從以下多個方面對Python存為JSON做詳細的闡述。 一、JSON簡介 JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,易於人閱…

    編程 2025-04-27
  • 使用Python獲取JSON並解析

    本文將介紹如何使用Python獲取JSON數據並解析相關內容。通過使用Python的第三方庫,我們可以輕鬆地處理JSON數據,包括讀取、提取和操作JSON數據。 一、獲取JSON數…

    編程 2025-04-27
  • 使用Spread 8展示JSON數據

    使用Spread 8可以方便地展示JSON數據,本文將詳細介紹如何利用Spread 8展示JSON數據。 一、Spread 8簡介 Spread 8是一款強大的電子表格軟件,可以方…

    編程 2025-04-27
  • 如何在json轉實體類時忽略大小寫

    本文將從以下幾個方面介紹如何在json轉實體類時忽略大小寫。 一、使用Gson庫實現json轉實體類忽略大小寫 Gson是Google提供的Java JSON操作庫,它提供了簡單易…

    編程 2025-04-27

發表回復

登錄後才能評論