首頁 >後端開發 >C++ >如何使用 System.Text.Json 將巢狀 JSON 反序列化為具有正確 C# 類型的巢狀物件字典?

如何使用 System.Text.Json 將巢狀 JSON 反序列化為具有正確 C# 類型的巢狀物件字典?

Linda Hamilton
Linda Hamilton原創
2024-12-25 02:40:17956瀏覽

How to Deserialize Nested JSON to a Nested Dictionary of Objects with Proper C# Types Using System.Text.Json?

使用正確的C# 類型將巢狀JSON 反序列化為物件的巢狀字典

在C# .Net Core 3.1 中使用System.Text.Json,反序列化將JSON 物件嵌套到Dictionary可能會導致每個物件都是 JsonElement。但是,我們可以自訂反序列化過程,為每個JSON 屬性類型取得正確的C# 類型:

自訂JsonConverter: ObjectAsPrimitiveConverter

As System.Text .Json 缺少內建-為了支援將自由格式的JSON 反序列化為原始類型,我們需要一個自訂的JsonConverter, ObjectAsPrimitiveConverter,它提供以下功能:

  • 轉換字串: JSON 字串屬性到C# 🎜>
  • 轉換數字: C# 的JSON數字屬性int/double
  • 轉換物件: JSON 物件屬性到字典

程式碼實作:

public class ObjectAsPrimitiveConverter : JsonConverter<object>
{
    // Configure converter settings (float format, unknown number handling, object format)
    ...

    public override void Write(Utf8JsonWriter writer, object value, JsonSerializerOptions options)
    {
        // Handle custom serialization if needed
    }

    public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        // Handle custom deserialization based on token type
    }
}
程式碼實作:

程式碼實作:

var options = new JsonSerializerOptions
{
    Converters = { new ObjectAsPrimitiveConverter() },
    WriteIndented = true,
};

// Deserialize to object or dynamic
dynamic d = JsonSerializer.Deserialize<dynamic>(json, options);
設定與用法:

若要使用自訂轉換器,請使用

ObjectAsPrimitiveConverter
    設定JsonSerializerOptions 並指定所需的設定:
  • 註:
轉換器處理邊緣情況,例如具有任意精度的數字,這可能不適合原始 C# 類型。它提供了錯誤處理或傳回此類數字的 JsonElement 的選項。 您可以配置轉換器以使用不同的浮點格式(雙精確度/十進位)和物件表示形式(字典或 ExpandoObject)。 有示範小提琴可供參考。

以上是如何使用 System.Text.Json 將巢狀 JSON 反序列化為具有正確 C# 類型的巢狀物件字典?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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