【问题标题】:Check if json object is exists检查json对象是否存在
【发布时间】:2019-11-25 18:29:29
【问题描述】:

我想检查使用 Newtonsoft 反序列化的 json 对象是否为空。 我正在使用这段代码,感觉有点hacky:

try{
dynamic jsonObject = JsonConvert.DeserializeObject(jsonString);
dynamic content = jsonObject.content.important;

 if (((JObject)content).ToString() != "{}"){ // inspecting if "imporant" has value
  // do stuff
  }
}catch(Exception e){
  // handle error
}

是否有更“造型师”的方法来检查对象是否存在?

【问题讨论】:

标签: c# json.net


【解决方案1】:

您可以在JObject content 中查看JTokens 的数量。如果JObject 为空,它将返回0。喜欢,

try
{
    dynamic jsonObject = JsonConvert.DeserializeObject(jsonString);
    dynamic content = jsonObject.content.important;

    if (((JObject)content).Count > 0){ // inspecting if "imporant" has value
        // do stuff
      }
}
catch(Exception e)
{
  // handle error
}

【讨论】:

    【解决方案2】:

    在反序列化之前检查jsonString 字符串变量的内容。您通过反序列化、序列化、然后比较使事情变得过于复杂。

    JSON 对象总是 以 { / } 开头和结尾,如果您的意思是“空”对象是其中没有属性的对象,那么您正在检查如果字符串值等于{}。

    if (jsonString.Trim() == "{}")
    {
       // object is empty
    }
    else
    {
       // do deserialization 
    }
    

    Trim() 被放入以防括号周围有空格。

    请注意,这里有 2 个边缘情况:

    1. 如果括号之间有空格,这段代码会认为它不是空的,这是错误的。
    2. 这不关心字符串是否是有效的 JSON。

    【讨论】:

    • 对于 1 你可以使用 string.Replace 而不是 trim
    • @DetectivePikachu 是的,问题是您需要替换每个空格 unicode 字符,这是我不想进入的极端情况。
    • @gunr2171,OP 不想检查根节点是否为空。他正在尝试检查 JObject jsonObject.content.important 是否包含任何 JToken。请检查 OP 的代码dynamic content = jsonObject.content.important;
    • @PrasadTelkikar 你是完全正确的。直到我发布这篇文章后,我自己才意识到这一点。呃,我会把这篇文章留在这里,而不是稍后删除它。
    猜你喜欢
    • 2022-01-16
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2017-02-14
    • 1970-01-01
    • 2017-12-07
    • 2012-07-27
    相关资源
    最近更新 更多