所以我有一个JToken。它内部可能有(或没有(JToken。让我们称之为";客户";。
它可以为null。
现在,我正在使用此代码来检查是否存在和空:
var client = MyJToken["client"];
if (client != null && client is not JValue)
但感觉不对。为什么我不能使用";MyJToken["客户端"]">
有人知道如何使用null传播进行检查吗?
编辑示例。
假设您有这个JSON:
https://pastebin.com/nSpP6LEQ
在"invoiceds"数组中,您将看到第一个为null,但第二个为value。
JToken位于一个invoiceds条目的级别。
那么,写的天真的东西会是mytoken["任务"]吗?["id"]
但这将失败,因为第一条记录为空,所以mytoken["task"]不是NULL,但具有NULL的JValue。
所以我的问题是:是否可以避免对JValue和null进行检查。写一些类似mytoken的东西["任务"]?["id"]。
在令牌级别上操作时没有什么可做的,因为应该有一种方法来区分未指定的JSON字段和设置为null的JSON字段。在第一种情况下是CCD_ 1,在第二种情况下为CCD_。
在这里,你能做的最好的事情就是编写一个扩展方法,比如:
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
,无论是在未指定的情况下,还是在明确设置为null值的情况下。我建议采用这种方法,因为无论如何,您都很可能从模型中读取属性。您可能还需要其他属性。
看看这里,看看它是如何实现的。还有一些C#模型生成器可以基于JSON为您创建模型类。例如此处或此处
此外,如果您进行编辑,Visual Studio 2022也可以为您创建模型类->选择性粘贴->将JSON粘贴为类。更多信息点击这里
也许您需要执行以下操作:
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");
}
}
}
}