检查JObject中的空JToken是否为空


90

我有以下...

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

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

JTokenToSql 看起来像这样...

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

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

Answers:


175

要检查上是否存在属性JObject,可以使用方括号语法,然后查看结果是否为null。如果属性存在,JToken将始终返回a(即使它null在JSON中具有值)。

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);
    }
}

1
我将其扩展方法设为:public static bool IsNullOrEmpty(this JToken token){...}像JToken token = jObject [“ param”]一样使用;布尔空= token.IsNullOrEmpty()
德米特里·帕夫洛夫

1
你不能ToSrtingJToken检查IsNullOrWhiteSpace?(检查后JToken,当然也不为空)
Coops,2015年

1
@CodeBlend不适用于对象或数组-分别为{}和时的序列化版本[]
Brian Rogers

1
我将添加属性检查:return(令牌== null)|| (token.Type == JTokenType.Array &&!token.HasValues)|| (token.Type == JTokenType.Object &&!token.HasValues)|| (token.Type == JTokenType.String && token.ToString()== String.Empty)|| (令牌.Type == JTokenType.Null)|| (token.Type == JTokenType.Property &&(((JProperty)token).Value.ToString()== string.Empty);
jcmontx

59

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

JToken token = jObject["key"];

if(token.Type == JTokenType.Null)
{
    // Do your logic
}

3
正是我在寻找什么,因为空参数返回的空类型通过了典型的==空比较。谢谢!
蒂姆·泰勒

4

还有一个类型-JTokenType.Undefined。

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

token.Type == JTokenType.Undefined

1

从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变量内。


0

尝试这样的事情将JToken转换为JArray:

static public JArray convertToJArray(JToken obj)
{
    // if ((obj).Type == JTokenType.Null) --> You can check if it's null here

    if ((obj).Type == JTokenType.Array)
        return (JArray)(obj);
    else
        return new JArray(); // this will return an empty JArray
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.