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