如何在带有 JsonConvert.DeserializeObject 的动态 JSON 中使用空条件运算符

How to use null conditional operator in a dynamic JSON with JsonConvert.DeserializeObject

我正在使用 Newtonsoft 反序列化一个已知的 JSON 对象并从中检索一些值(如果它们存在)。

关键是对象结构可能会不断变化,所以我使用动态来遍历结构并检索值。由于对象结构不断变化,我使用 null 条件运算符遍历 JSON.

代码如下所示

dynamic jsonMeta = JsonConvert.DeserializeObject<dynamic>(jsonScript);
string gVal = jsonMeta.a?.b?.c?.d?.e?.f?.g?.Value ?? ""

整个想法是以空安全的方式遍历对象,这样如果一个成员不存在,它的计算结果为 null 并为其分配一个默认值而不抛出异常。但是我看到的是,如果该成员 d 是 null.

,我会得到一个异常 'Newtonsoft.Json.Linq.JValue' does not contain a definition for 'e'

我的理解是,虽然 dValuenull,但它是 JValue 类型,所以这就是空条件运算符的原因不起作用,但随后它尝试访问 d 内的成员 e,它抛出异常。

所以我的问题是如何在 C# 中完成这项工作?有没有一种简单的方法可以在不知道 JSON 结构的情况下以单行或相对简单的方式访问 JSON 成员?

不幸的是,由于 NewtonSoft 的设计限制 JSON.NET,它不能按照我上面想要的方式使用 null 合并或 null 条件运算符。

我找到的唯一解决方案是使用 System.Web.Helpers.Json,此实现允许您执行我在上面尝试执行的操作,而无需 运行 进入 JSON.NET 抛出的异常,因为它在运行时评估成员的方式导致访问动态 JSON 结构成员的简单方法。另外,您不需要为成员引用 Value,它是隐含的。

using System.Web.Helpers.Json

dynamic jsonMeta = Json.Decode(jsonString);
string gVal = jsonMeta.a?.b?.c?.d?.e?.f?.g ?? ""

然而,您需要根据所使用的 Visual Studio 版本(JSON.NET 也需要)单独安装程序集。使用 VS 2019,通过 IDE 错误助手单击即可轻松安装。此处有更多详细信息:Where can I find System.Web.Helpers, System.Web.WebPages, and System.Web.Razor?