第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

System.Text.Json.JsonElement ToObject 解決方法

System.Text.Json.JsonElement ToObject 解決方法

PHP
12345678_0001 2024-01-20 15:50:11
我想知道Json.NETToObject<>()中System.Text.Json的方法的等效項(xiàng)。使用 Json.NET,您可以使用任何JToken并將其轉(zhuǎn)換為類。例如:var str = ""; // Some JSON stringvar jObj = JObject.Parse(str);var myClass = jObj["SomeProperty"].ToObject<SomeClass>();我們?nèi)绾问褂?.NET Core 3 的新功能來做到這一點(diǎn)System.Text.Json?var str = ""; // Some JSON stringvar jDoc = JsonDocument.Parse(str);var myClass = jDoc.RootElement.GetProperty("SomeProperty"). <-- now what??最初,我想我只是將JsonElement返回的值轉(zhuǎn)換jDoc.RootElement.GetPRoperty("SomeProperty")為字符串,然后反序列化該字符串。但我覺得這可能不是最有效的方法,而且我無法真正找到有關(guān)以其他方式執(zhí)行此操作的文檔。
查看完整描述

4 回答

?
婷婷同學(xué)_

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個贊

在 .NET 6 中,添加了擴(kuò)展方法以直接從orJsonSerializer反序列化對象:JsonElementJsonDocument

public static partial class JsonSerializer

{

? ? public static TValue? Deserialize<TValue>(this JsonDocument document, JsonSerializerOptions? options = null);

? ? public static object? Deserialize(this JsonDocument document, Type returnType, JsonSerializerOptions? options = null);

? ? public static TValue? Deserialize<TValue>(this JsonDocument document, JsonTypeInfo<TValue> jsonTypeInfo);

? ? public static object? Deserialize(this JsonDocument document, Type returnType, JsonSerializerContext context);


? ? public static TValue? Deserialize<TValue>(this JsonElement element, JsonSerializerOptions? options = null);

? ? public static object? Deserialize(this JsonElement element, Type returnType, JsonSerializerOptions? options = null);

? ? public static TValue? Deserialize<TValue>(this JsonElement element, JsonTypeInfo<TValue> jsonTypeInfo);

? ? public static object? Deserialize(this JsonElement element, Type returnType, JsonSerializerContext context);

}

現(xiàn)在您將能夠執(zhí)行以下操作:


using var jDoc = JsonDocument.Parse(str);

var myClass = jDoc.RootElement.GetProperty("SomeProperty").Deserialize<SomeClass>();

筆記:

  • JsonDocument是一次性的。根據(jù)文檔,該類利用池化內(nèi)存中的資源...未能正確處置該對象將導(dǎo)致內(nèi)存未返回到池中,這將增加GC框架各個部分的

    因此,請務(wù)必用聲明來聲明您的jDoc情況using

  • 新方法應(yīng)該出現(xiàn)在.NET 6.0 Preview RC1中。

    它們是為了響應(yīng)增強(qiáng)請求而添加的。我們應(yīng)該能夠從 DOM #31274 進(jìn)行序列化和序列化,該請求已關(guān)閉。

  • 還為新的可變 JSON 文檔節(jié)點(diǎn)添加了類似的擴(kuò)展方法JsonNode

public static TValue? Deserialize<TValue>(this JsonNode? node, JsonSerializerOptions? options = null)

public static object? Deserialize(this JsonNode? node, Type returnType, JsonSerializerOptions? options = null)

public static TValue? Deserialize<TValue>(this JsonNode? node, JsonTypeInfo<TValue> jsonTypeInfo)

public static object? Deserialize(this JsonNode? node, Type returnType, JsonSerializerContext context)

在 .NET 5 及更早版本中,這些方法不存在。作為解決方法,您可以通過寫入中間byte緩沖區(qū)而不是字符串來獲得更好的性能,因?yàn)?和JsonDocument都Utf8JsonReader直接使用byte跨度而不是字符串或char跨度。如文檔中所述:


序列化為 UTF-8 比使用基于字符串的方法大約快 5-10%。區(qū)別在于字節(jié)(UTF-8)不需要轉(zhuǎn)換為字符串(UTF-16)。


public static partial class JsonExtensions

{

? ? public static T ToObject<T>(this JsonElement element, JsonSerializerOptions options = null)

? ? {

? ? ? ? var bufferWriter = new ArrayBufferWriter<byte>();

? ? ? ? using (var writer = new Utf8JsonWriter(bufferWriter))

? ? ? ? ? ? element.WriteTo(writer);

? ? ? ? return JsonSerializer.Deserialize<T>(bufferWriter.WrittenSpan, options);

? ? }


? ? public static T ToObject<T>(this JsonDocument document, JsonSerializerOptions options = null)

? ? {

? ? ? ? if (document == null)

? ? ? ? ? ? throw new ArgumentNullException(nameof(document));

? ? ? ? return document.RootElement.ToObject<T>(options);

? ? }

}

演示小提琴在這里。




查看完整回答
反對 回復(fù) 2024-01-20
?
慕娘9325324

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個贊

我遇到了同樣的問題,所以我編寫了一些擴(kuò)展方法,目前效果很好。如果他們將其作為內(nèi)置方法提供以避免對字符串的額外分配,那就太好了。


public static T ToObject<T>(this JsonElement element)

{

    var json = element.GetRawText();

    return JsonSerializer.Deserialize<T>(json);

}

public static T ToObject<T>(this JsonDocument document)

{

    var json = document.RootElement.GetRawText();

    return JsonSerializer.Deserialize<T>(json);

}

然后使用如下:


jDoc.RootElement.GetProperty("SomeProperty").ToObject<SomeClass>();


查看完整回答
反對 回復(fù) 2024-01-20
?
jeck貓

TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個贊

只是包括允許您通過 指定返回類型的方法Type returnType。

public static partial class JsonExtensions

{

? ? public static T ToObject<T>(this JsonElement element, JsonSerializerOptions options = null)

? ? {

? ? ? ? var bufferWriter = new ArrayBufferWriter<byte>();

? ? ? ? using (var writer = new Utf8JsonWriter(bufferWriter))

? ? ? ? {

? ? ? ? ? ? element.WriteTo(writer);

? ? ? ? }


? ? ? ? return JsonSerializer.Deserialize<T>(bufferWriter.WrittenSpan, options);

? ? }


? ? public static T ToObject<T>(this JsonDocument document, JsonSerializerOptions options = null)

? ? {

? ? ? ? if (document == null)

? ? ? ? {

? ? ? ? ? ? throw new ArgumentNullException(nameof(document));

? ? ? ? }


? ? ? ? return document.RootElement.ToObject<T>(options);

? ? }? ? ? ?


? ? public static object ToObject(this JsonElement element, Type returnType, JsonSerializerOptions options = null)

? ? {

? ? ? ? var bufferWriter = new ArrayBufferWriter<byte>();

? ? ? ? using (var writer = new Utf8JsonWriter(bufferWriter))

? ? ? ? {

? ? ? ? ? ? element.WriteTo(writer);

? ? ? ? }


? ? ? ? return JsonSerializer.Deserialize(bufferWriter.WrittenSpan, returnType, options);

? ? }


? ? public static object ToObject(this JsonDocument document, Type returnType, JsonSerializerOptions options = null)

? ? {

? ? ? ? if (document == null)

? ? ? ? {

? ? ? ? ? ? throw new ArgumentNullException(nameof(document));

? ? ? ? }


? ? ? ? return document.RootElement.ToObject(returnType, options);

? ? }? ? ? ?

}


查看完整回答
反對 回復(fù) 2024-01-20
?
至尊寶的傳說

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個贊

.NET 6引入了System.Text.Json.Nodes命名空間,它提供了一種使用與 Json.Net 幾乎完全相同的語法來執(zhí)行此操作的方法:

var str = ""; // some json string

var node = JsonNode.Parse(str);

var myClass = node["SomeProperty"].Deserialize<SomeClass>();

命名空間包括 4 個新類型:JsonNode、JsonArrayJsonObject、 和JsonValue可用于訪問或修改 DOM 中的值。JsonNode是其他三種類型的基類。

Deserialize中列出的擴(kuò)展方法也已添加到 上進(jìn)行操作,例如:JsonNode

public?static?TValue??Deserialize<TValue>(this?JsonNode??node,?JsonSerializerOptions??options?=?null);

JsonNode不是一次性的,因此您不需要使用using語法。

使用AsObject()or分別AsArray()解析為JsonObjector?JsonArray

// parse array

JsonArray arr = JsonNode.Parse(@"[{""Name"": ""Bob"", ""Age"":30}]").AsArray();

// parse object

JsonObject obj = JsonNode.Parse(@"{""Name"": ""Bob"", ""Age"":30}").AsObject();

// get a value

var date = JsonNode.Parse(@"{""Date"":""2021-12-21T13:24:46+04:00""}")["Date"].GetValue<DateTimeOffset>();

一旦 json 被解析,就可以導(dǎo)航、過濾和轉(zhuǎn)換 DOM 和/或應(yīng)用于Deserialize<T>()映射到您的具體類型。


要序列化回 json 字符串,您可以使用ToJsonString(),例如:


string innerNodeJson = node["SomeProperty"].ToJsonString();


查看完整回答
反對 回復(fù) 2024-01-20
  • 4 回答
  • 0 關(guān)注
  • 384 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號