探究newtonsoft.json反序列化

一、JSON介紹

JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,易於閱讀和編寫,同時也易於解析和生成。它基於JavaScript語言的子集,但是它是一種獨立於編程語言的數據格式。

JSON數據可以表示為一個文本字符串,它使用一些簡單的規則來描述數據的結構。一個JSON值可以是一個對象、一個數組、一個數字、一個字符串、一個布爾值,或者一個null。對象由一對花括號{}包裹,數組由一對中括號[]包裹。

二、Newtonsoft.Json介紹

Newtonsoft.Json是一款.NET平台下的JSON處理庫,支持.NET Framework、.NET Core以及Mono平台,提供了一個快速簡便的方式去序列化和反序列化.NET對象。

Newtonsoft.Json支持基本類型或對象轉化為JSON表示,並且可以從JSON表示中還原回對象,它的反序列化功能非常強大。

三、反序列化數據類型

Newtonsoft.Json支持多種數據類型的反序列化,包括簡單類型(如字符串、數字、布爾等)、自定義類型、集合類型等。

四、JSON到對象反序列化示例

//json字符串示例
string json = "{ \"name\": \"Bruce\", \"age\": 38 }";

//定義一個Person類,用於反序列化
public class Person
{
    public string name { get; set; }
    public int age { get; set; }
}

//反序列化為Person對象
Person person = JsonConvert.DeserializeObject<Person>(json);

在上面的示例中,首先定義了一個JSON字符串,然後定義了一個Person類,即我們要反序列化為的對象,最後調用Newtonsoft.Json的DeserializeObject方法進行反序列化,其中泛型參數為要轉換的目標類型。

五、多層嵌套JSON反序列化

在實際應用中,我們經常會遇到多層嵌套的JSON數據,例如下面的JSON字符串:

{
    "name": "Bruce",
    "age": 38,
    "address": {
        "street": "123 Main Street",
        "city": "New York"
    }
}

要反序列化該JSON數據,只需在Person類中添加一個Address屬性,並定義一個嵌套的Address類:

public class Person
{
    public string name { get; set; }
    public int age { get; set; }
    public Address address { get; set; }
}

public class Address
{
    public string street { get; set; }
    public string city { get; set; }
}

修改後的Person類中包含了一個Address類型的屬性,然後再次調用DeserializeObject方法,就可以實現多層JSON的反序列化。

六、JSON數組反序列化

JSON數組是指由一組元素組成的集合,例如下面的JSON字符串:

[
    {
        "name": "Bruce",
        "age": 38
    },
    {
        "name": "Tony",
        "age": 40
    },
    {
        "name": "Steve",
        "age": 100
    }
]

要反序列化上述JSON數組,只需將其定義為一個Person對象的集合即可:

//json字符串示例
string json = "......";

//定義Person類和一個集合用於保存反序列化後的對象
public class Person
{
    public string name { get; set; }
    public int age { get; set; }
}

List<Person> people = JsonConvert.DeserializeObject<List<Person>>(json);

在上面的示例中,使用了List<Person>類型來保存反序列化後的Person對象集合,同樣調用DeserializeObject方法即可完成JSON數組的反序列化。

七、使用JsonProperty特性指定JSON屬性名

在默認情況下,Newtonsoft.Json會將對象屬性名和對應的JSON屬性名一一匹配。但是,當JSON屬性名與對象屬性名不匹配時,我們可以使用JsonProperty特性來指定JSON屬性名稱。

public class Person
{
    [JsonProperty("Name")]
    public string name { get; set; }
    [JsonProperty("Age")]
    public int age { get; set; }
}

在上面的示例中,使用了JsonProperty特性來指定了JSON屬性名,即將Person類的name屬性對應到JSON的Name屬性,將age屬性對應到JSON的Age屬性。

八、使用DefaultValueHandling特性設置默認值

當JSON數據中缺少一些屬性時,反序列化的結果中對應的屬性值為null。如果我們需要設置默認值,可以使用DefaultValueHandling特性來指定默認值。

public class Person
{
    public string name { get; set; }
    [DefaultValue(25)]
    public int age { get; set; }
}

在上面的示例中,使用了DefaultValueHandling特性來指定了age屬性的默認值為25,即JSON數據中如果缺少age屬性,則age屬性的值默認為25。

九、使用JsonConverter自定義反序列化

有些時候,我們需要對某些特殊的JSON格式進行自定義的反序列化處理。例如,某些JSON格式中的日期類型可能並不是我們期望的格式,此時可以自定義JsonConverter來進行反序列化。

//自定義一個DateTimeConverter用於反序列化
public class DateTimeConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DateTime);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        DateTime result;
        if (DateTime.TryParse(reader.Value.ToString(), out result))
        {
            return result;
        }
        else
        {
            return new DateTime();
        }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss"));
    }
}

//定義一個包含日期屬性的Person類
public class Person
{
    public string name { get; set; }
    [JsonConverter(typeof(DateTimeConverter))] //使用上面定義的DateTimeConverter
    public DateTime birthday { get; set; }
}

//json字符串示例
string json = "{ \"name\": \"Bruce\", \"birthday\": \"2021-12-12 12:12:12\" }";

//反序列化為Person對象
Person person = JsonConvert.DeserializeObject<Person>(json);

在上面的示例中,我們自定義了一個DateTimeConverter來處理日期格式,其中CanConvert方法指定了要處理的數據類型,ReadJson方法實現了反序列化邏輯,WriteJson方法實現了序列化邏輯。然後在類的birthday屬性上使用了JsonConverter特性來指定使用我們自定義的DateTimeConverter進行反序列化。

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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
WBFED的頭像WBFED
上一篇 2025-02-05 13:06
下一篇 2025-02-05 13:06

相關推薦

  • 金額選擇性序列化

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

    編程 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

發表回復

登錄後才能評論