所以我有一個 JToken。它內部可能有(或沒有)一個 JToken。我們稱它為“客戶”。
它可以為空。
現在,我正在使用此代碼來檢查存在和 null :
var client = MyJToken["client"];
if (client != null && client is not JValue)
但就是感覺不對。為什么我不能使用 "MyJToken["client"] ?? "
任何人都知道如何使用空傳播進行檢查?
編輯示例。
所以假設你有這個 JSON :
https://pastebin.com/nSpP6LEQ
在“invoiceds”陣列中,您會看到第一個為空,但第二個有值。
JToken 處于一個發票條目的級別。
所以最天真的寫法是 mytoken[“task”]?[“id”]
但這會失敗,因為第一條記錄為空,所以 mytoken[“task”] 不為空,但 JValue 為空。
所以我的問題是:無論如何都要避免檢查 JValue 和 null。并寫一些接近 mytoken[“task”]?[“id”] 的東西。
uj5u.com熱心網友回復:
在令牌級別上操作時您無能為力,因為應該有一種方法可以區分未指定的 JSON 欄位并設定為 null。這是MyJToken["client"] is null第一種情況和MyJToken["client"].Type == JTokenType.Null第二種情況。
您可以在這里做的最好的事情是撰寫一個擴展方法,例如:
internal static class JsonExtensions
{
public static void HasValue(this JToken token) => token is { Type: not JTokenType.Null };
}
然后像這樣使用它:
if (MyJToken["client"].HasValue())
{
//...
}
這也適用于空傳播:
if (token["x"]?["y"]?["z"].HasValue())
{
//...
}
但是,您還可以將 JSON 反序列化為物件。在這種情況下,您要查找的屬性將被設定為null兩種情況,以防它未指定,以防它被顯式設定為空值。我建議使用這種方法,因為無論如何您很可能會從模型中讀取屬性。您可能還需要其他屬性。
看看這里,看看它是如何實作的。還有一堆 C# 模型生成器可以根據您的 JSON 為您創建模型類。例如這里或這里
如果您執行編輯 -> 選擇性粘貼 -> 將 JSON 粘貼為類,Visual Studio 2022 也可以為您創建模型類。更多資訊在這里
uj5u.com熱心網友回復:
也許您需要執行以下操作:
using Newtonsoft.Json.Linq;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
var json = "[{\"foo\": \"bar\"},{\"task\": null}, {\"task\": 23}, {\"task\": {\"inner\": true}}]";
var jArray = JArray.Parse(json);
foreach (var item in jArray.Children())
{
if (item is JObject obj)
{
DoSomething(obj);
}
}
}
static void DoSomething(JObject obj)
{
var token = obj["task"];
if (token is null)
{
Console.WriteLine("'task' property is missing");
}
else if (token is JValue jValue)
{
if (jValue.Type == JTokenType.Null)
{
Console.WriteLine("'task' property is inside the provided object. its value is json NULL");
}
else
{
Console.WriteLine($"'task' property is inside the provided object. its value is {jValue.Value}");
}
}
else if (token is JObject jObject)
{
Console.WriteLine("'task' property is inside the provided object. its value is an object");
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/519952.html
上一篇:檢查一個鍵是否存在并回傳另一個鍵
