JToken中的Null传播



所以我有一个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");
}
}
}
}

相关内容

  • 没有找到相关文章

最新更新