首頁 >後端開發 >C++ >如何使用 System.Text.Json 序列化和反序列化欄位?

如何使用 System.Text.Json 序列化和反序列化欄位?

Susan Sarandon
Susan Sarandon原創
2025-01-14 07:22:45843瀏覽

How Can I Serialize and Deserialize Fields Using System.Text.Json?

System.Text.Json:序列化與反序列化欄位

在較新的.NET版本中,System.Text.Json.JsonSerializer 是首選的JSON序列化和反序列化方法。然而,它對包含字段變數的類別提出了挑戰,因為這些變數並非預設支援。

問題所在

在舊版的.NET中,欄位變數可以包含在序列化/反序列化過程中。隨著JsonSerializer的引入,只有屬性得到支持,導致以下問題:

<code class="language-csharp">using System.Text.Json;

public class Car
{
    public int Year { get; set; } // 正确序列化
    public string Model; // 未正确序列化(字段变量)
}

static void Problem()
{
    Car car = new Car()
    {
        Model = "Fit",
        Year = 2008,
    };
    string json = JsonSerializer.Serialize(car); // {"Year":2008}
    Car carDeserialized = JsonSerializer.Deserialize<Car>(json);

    Console.WriteLine(carDeserialized.Model); // null!
}</code>

解決方法

為了解決這個問題,有兩種策略:

1. .NET 5及更高版本

從.NET 5開始,可以透過以下方法序列化和反序列化公共欄位:

  • JsonSerializerOptions.IncludeFields設定為true
  • 新增[JsonInclude]特性

範例:

<code class="language-csharp">using System.Text.Json;
using System.Text.Json.Serialization;

static void Main()
{
    var car = new Car { Model = "Fit", Year = 2008 };

    // 启用支持
    var options = new JsonSerializerOptions { IncludeFields = true };

    // 传递“options”
    var json = JsonSerializer.Serialize(car, options);

    // 传递“options”
    var carDeserialized = JsonSerializer.Deserialize<Car>(json, options);

    Console.WriteLine(carDeserialized.Model); // 输出 "Fit"
}

public class Car
{
    public int Year { get; set; }
    [JsonInclude]
    public string Model;
}</code>

2. .NET Core 3.x

在.NET Core 3.x中,不支援欄位序列化。作為一種變通方法,可以考慮使用自訂轉換器來實現所需的行為。

更多資訊和詳細文檔,請參考以下資源:

  • .NET 文件:System.Text.Json
  • GitHub Issues: #34558 和 #876

以上是如何使用 System.Text.Json 序列化和反序列化欄位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn