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



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

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

代码看起来像这个

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

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

我的理解是,虽然dValuenull,但它的类型是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所必需的(。使用VS2019,只需单击IDE错误助手即可轻松安装。有关它的更多详细信息,请点击此处:在哪里可以找到System.Web.Helpers、System.Web.WebPages和System.Web.Razor?

相关内容

  • 没有找到相关文章

最新更新