Проверка пустого/нулевого JToken в JObject

У меня есть следующее...

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.. Но, похоже, не работает.

Ответ 1

Чтобы проверить, существует ли свойство в JObject, вы можете использовать синтаксис квадратной скобки и посмотреть, является ли результат нулевым или нет. Если свойство существует, всегда будет возвращено значение JToken (даже если оно имеет значение 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);
    }
}

Ответ 2

Вы можете действовать следующим образом, чтобы проверить, имеет ли значение JToken значение null

JToken token = jObject["key"];

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