c# - 我如何知道动态对象的属性是否不存在或其值为空?使用牛顿软件

标签 c# .net json.net

如果我这样访问属性:

if (dynamicObject["propertyName"] == null)

我会在两种情况下为真:

  1. 此动态对象中不存在此属性。

  2. 该属性存在但其值为空

当我使用 Newtonsoft 库时,GetType() 将返回“JObject”,而“JObject”的 GetProperty() 不起作用(始终返回 null)。因此我无法使用它。

dynamicObject.GetType().GetProperty()

如何区分这两种情况?我可以做其他准确的检查吗?

最佳答案

有几种方法可以解决这个问题;两者非常相似。

选项 1

因为您已经知道您的动态对象实际上是一个 JObject,您可以转换它(或者完全消除动态变量并将您的 JSON 直接反序列化为 JObject从一开始)。从那里,您可以使用相同的语法来尝试获取属性值(JToken)。如果该属性不存在,则结果将为空。否则,您可以检查 token 的 Type 属性以确定它是 JTokenType.Null 还是其他 token 类型:

JObject jo = (JObject)dynamicObject;
JToken token = jo["propertyName"];
if (token == null)
{
    Console.WriteLine("property does not exist.");
}
else if (token.Type == JTokenType.Null)
{
    Console.WriteLine("property exists with a value of null.");
}
else
{
    Console.WriteLine("property exists with with a value of \"" + token.ToString() + "\".");
}

fiddle :https://dotnetfiddle.net/3Nrwns

选项 2

如果您更喜欢按原样使用动态对象,则需要使用 object.ReferenceEquals 来确定该属性是否存在。如果是,那么您可以使用常规空检查来查明该值是否为空:

dynamic val = dynamicObject["propertyName"];
if (object.ReferenceEquals(val, null))
{
    Console.WriteLine("property does not exist.");
}
else if (val == null)
{
    Console.WriteLine("property exists with a value of null.");
}
else
{
    Console.WriteLine("property exists with with a value of \"" + val.ToString() + "\".");
}

fiddle :https://dotnetfiddle.net/4Mmbak

关于c# - 我如何知道动态对象的属性是否不存在或其值为空?使用牛顿软件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40466471/

相关文章:

c# - 如何在Windows Phone中反序列化json字符串?

C# 使用哪种模式为长时间运行的任务提供同步和发布/订阅场景

c# - 为什么 C# 编译器对 double IEnumerable<T> 和 foreach T 很满意?

.net - 全局方法?

c# - XSD.EXE + JSON.NET - 如何处理xxxSpecified生成的成员?

c# - 将平均线、最小线和最大线添加到散点图

c# - 检查文件是否已在源代码管理中

c# - 如何使用 JSON.NET 遍历嵌套字典?

c# - 将 EF 模型序列化为 Json 时的循环引用

c# - 使用不可变嵌套对象反序列化 Json.NET