考慮 .NET 6 的System.Text.Json.JsonSerializer.Deserialize方法及其許多多載。
每一個都回傳或者object?表示TValue?可以null回傳。但是,檔案指出,如果發生任何錯誤,則會引發例外。此外,它還宣告回傳了一個有效值(如果沒有拋出例外)。它沒有說明null可以退回。并且根據我使用它的經驗,null永遠不會退還。
(如果您在專案中打開“可空性”,可為空的回傳型別是一個問題,因為編譯器隨后開始警告您回傳的值可能為空- 根據我的經驗(并且根據檔案),這不是真的。正是這種事情讓我急于再次關閉可空性。我知道我可以抑制警告,但我認為這不是重點。)
缺少檔案嗎?這些方法真的可以回傳null嗎?如果他們不能,那為什么我們有可以為空的回傳型別呢?
uj5u.com熱心網友回復:
TValue? Deserialize<TValue>只是Object? Deserialize(type: typeof(TValue)).- 當
#nullable注釋被添加到 C# 8.0 時,該System.Type型別沒有擴展以支持這些注釋。- 因此,C# 中的泛型型別不可能(在運行時)知道泛型型別引數的具體型別引數是可空參考型別還是不可空參考型別。
- (當然,這不適用于
Nullable<T>)
- (當然,這不適用于
- 因此,C# 中的泛型型別不可能(在運行時)知道泛型型別引數的具體型別引數是可空參考型別還是不可空參考型別。
Deserialize<TValue>()因此,在運行時,使用TValue := MyClass?or的呼叫站點的TValue := MyClass行為相同,因為該Deserialize方法不知道是否MyClass具有?注釋。- 該
Deserialize<TValue>方法只知道是否TValue是參考型別(通過typeof(TValue))。
- 該
- 因此,如果您指示
JsonSerializer反序列化字串"null"(這是有效的 JSON)并且如果TValue是參考型別,那么它將回傳null.- ...即使你
TValue沒有?. 請記住,JsonSerializer不(也不能)知道這一點!
- ...即使你
- 這就是該方法的靜態回傳型別具有
?注釋的原因,因為如果沒有,那么它將錯誤地斷言它永遠不會回傳null。
可以說JsonSerialize's 的設計者可以添加更多的方法,允許呼叫者靜態斷言非空性,但他們沒有,但如果你真的想要,你可以:
像這樣:
public static TValue DeserializeNonNullObject<TValue>( String json )
where TValue : class
{
TValue? orNull = JsonSerializer.Deserialize<TValue>( json );
return orNull ?? throw new JsonException( "Expected deserialized object to be non-null, but encountered null." );
}
uj5u.com熱心網友回復:
根據 RFC 7159,“null”(以及“true”和“false”)將是有效的 JSON 文本。但是,空字串不是有效的 JSON。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/426798.html
標籤:C# json 。网 反序列化 system.text.json
下一篇:決議JSON的Swift問題
