当尝试访问属性时,带有动态JSON的ExpandoObject抛出异常

frebpwbc  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(88)

我有一个动态JSON字符串(结构可以根据服务器发送的内容而变化)。我使用Newstonsoft.Json作为动态ExpandoObject来实现它

dynamic jsonMeta = JsonConvert.DeserializeObject<ExpandoObject>(jsonScript, new ExpandoObjectConverter());

我使用dynamic ExpandoObject的原因是因为它应该允许我灵活地使用非固定的JSON结构。
我正在尝试访问一个名为(例如)的属性。plot)可能存在也可能不存在:

string plot = jsonMeta.plot

我面临的问题是,当plot不存在于JSON字符串中时,我希望它返回一个'null',但它却抛出了一个异常:
“System.Dynamic.ExpandoObject”不包含“plot”的定义Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
当它遇到一个不存在的属性时,我如何让它返回一个null而不是抛出一个异常?
我宁愿不尝试检查属性的存在,因为它会导致极端的代码膨胀,因为我的目标是使用像jsonMeta.plot?.name?.text这样的嵌套空条件运算符
是否可以覆盖或更改ExpandoObject的行为?如果有一个更干净的方法来处理这种情况,我愿意考虑它(不绑定到ExpandoObject或Newtonsoft.Json)。
编辑:有人将其标记为duplicate of this question。这是完全不同的,它不是关于如何匿名化JSON,而是关于如何在访问匿名化JSON中的属性时(使用ExpandoObject或任何其他方法)* 不获得异常 *。

rlcwz9us

rlcwz9us1#

ExpandoObject实际上只是一个字典。所以你可以用字典代替。

Dictionary<string,object?> jsonMeta = JsonConvert.DeserializeObject<Dictionary<string,object?>>(jsonScript);

因此,您可以简单地检查现有的密钥,并基于此执行您的工作。

if (jsonMeta.ContainsKey("plot"))
{
    string plot = jsonMeta["plot"] as string;
}

相关问题