[英]JsonConvert.DeserializeObject generates a null dynamic object
[英]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'
。
我的理解是,虽然d
的值是null
,但它是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.