c#-检查JObj中的空/空JToken

我有以下...

JArray clients = (JArray)clientsParsed["objects"];

foreach (JObject item in clients.Children())
{
    // etc.. SQL params stuff...
    command.Parameters["@MyParameter"].Value = JTokenToSql(item["thisParameter"]);
}

((JObject)obj).Count看起来像这样...

public static object JTokenToSql(JToken obj)
{
    if (obj.Any())
        return (object)obj;
    else
        return (object)DBNull.Value;
}

我也尝试了((JObject)obj).Count。但是似乎没有用。

Kyle asked 2019-10-08T09:42:19Z
4个解决方案
117 votes

要检查JToken上是否存在属性,可以使用方括号语法并查看结果是否为null。 如果该属性存在,则将始终返回JToken(即使JSON中的值为null)。

JToken token = jObject["param"];
if (token != null)
{
    // the "param" property exists
}

如果您手头有JToken,并且想查看它是否非空,那么这取决于JToken是什么类型以及如何定义“空”。 我通常使用这样的扩展方法:

public static class JsonExtensions
{
    public static bool IsNullOrEmpty(this JToken token)
    {
        return (token == null) ||
               (token.Type == JTokenType.Array && !token.HasValues) ||
               (token.Type == JTokenType.Object && !token.HasValues) ||
               (token.Type == JTokenType.String && token.ToString() == String.Empty) ||
               (token.Type == JTokenType.Null);
    }
}
Brian Rogers answered 2019-10-08T09:42:38Z
28 votes

您可以按照以下步骤检查JToken值是否为null

JToken token = jObject["key"];

if(token.Type == JTokenType.Null)
{
    // Do your logic
}
Sam Ngugi answered 2019-10-08T09:43:03Z
1 votes

从C#7开始,您还可以使用以下代码:

if (clientsParsed["objects"] is JArray clients) 
{
    foreach (JObject item in clients.Children())
    {
        if (item["thisParameter"] as JToken itemToken) 
        {
            command.Parameters["@MyParameter"].Value = JTokenToSql(itemToken);
        }
    }
}

is运算符检查Type,如果其正确,则Value在clients变量内。

Sebastian answered 2019-10-08T09:43:33Z
0 votes

还有一个类型-JTokenType.Undefined。

此检查必须包含在@Brian Rogers答案中。

token.Type == JTokenType.Undefined
aleha answered 2019-10-08T09:44:06Z
translate from https://stackoverflow.com:/questions/24066400/checking-for-empty-null-jtoken-in-a-jobject