簡體   English   中英

使用 System.Text.Json 反序列化匿名類型

[英]Deserialize anonymous type with System.Text.Json

我正在為 .NET Core 3.x 更新一些應用程序,作為其中的一部分,我試圖從Json.NET轉移到新的System.Text.Json類。 使用 Json.NET,我可以反序列化一個匿名類型,如下所示:

var token = JsonConvert.DeserializeAnonymousType(jsonStr, new { token = "" }).token;

新命名空間中是否有等效的方法?

作為 。 Net 5.0 中System.Text.Json支持不可變類型的反序列化,從而支持匿名類型。 How to use immutable types and non-public accessors with System.Text.Json

System.Text.Json可以使用參數化構造函數,這使得反序列化不可變類或結構成為可能。 對於類,如果唯一的構造函數是參數化的,則將使用該構造函數。

由於匿名類型只有一個構造函數,它們現在可以成功反序列化。 為此,定義一個輔助方法,如下所示:

public static partial class JsonSerializerExtensions
{
    public static T DeserializeAnonymousType<T>(string json, T anonymousTypeObject, JsonSerializerOptions options = default)
        => JsonSerializer.Deserialize<T>(json, options);

    public static ValueTask<TValue> DeserializeAnonymousTypeAsync<TValue>(Stream stream, TValue anonymousTypeObject, JsonSerializerOptions options = default, CancellationToken cancellationToken = default)
        => JsonSerializer.DeserializeAsync<TValue>(stream, options, cancellationToken); // Method to deserialize from a stream added for completeness
}

現在你可以這樣做:

var token = JsonSerializerExtensions.DeserializeAnonymousType(jsonStr, new { token = "" }).token;

演示小提琴在這里

請試試我作為 System.Text.Json 擴展編寫的這個庫,以提供缺少的功能: https : //github.com/dahomey-technologies/Dahomey.Json

您會發現對匿名類型的支持。

通過在 JsonSerializerOptions 上調用命名空間 Dahomey.Json 中定義的擴展方法 SetupExtensions 來設置 json 擴展:

JsonSerializerOptions options = new JsonSerializerOptions();
options.SetupExtensions();

然后使用 JsonSerializerExtensions 靜態類型序列化您的類:

var token = JsonSerializerExtensions.DeserializeAnonymousType(jsonStr, new { token = "" }, options).token;

我正在更新.NET Core 3.x的一些應用程序,作為其中的一部分,我試圖從Json.NET遷移到新的System.Text.Json類。 使用Json.NET,我可以反序列化匿名類型,如下所示:

var token = JsonConvert.DeserializeAnonymousType(jsonStr, new { token = "" }).token;

新名稱空間中是否存在等效的方法?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM