繁体   English   中英

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

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

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

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

代码看起来像这样

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

整个想法是以 null 安全方式遍历 object,这样如果成员不存在,它的计算结果为null并为其分配默认值而不抛出异常。 但我看到的是,如果该成员 d 是null ,我得到一个异常'Newtonsoft.Json.Linq.JValue' does not contain a definition for 'e'

我的理解是,虽然dnull ,但它是JValue类型,所以这就是 null 条件运算符不起作用的原因,但随后它尝试访问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报错助手一键安装非常简单。 此处有更多详细信息: 我在哪里可以找到 System.Web.Helpers、System.Web.WebPages 和 System.Web.Razor?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM