Vérification du JToken vide ou nul dans un JObject

90

J'ai ce qui suit ...

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

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

JTokenToSql ressemble à ça...

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

J'ai essayé ((JObject)obj).Countaussi .. Mais ne semble pas fonctionner.

Kyle
la source

Réponses:

176

Pour vérifier si une propriété existe sur a JObject, vous pouvez utiliser la syntaxe entre crochets et voir si le résultat est nul ou non. Si la propriété existe, un JTokensera toujours retourné (même s'il a la valeur nulldans le JSON).

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

Si vous en avez un JTokenen main et que vous voulez voir s'il n'est pas vide, eh bien, cela dépend de son type JTokenet de la manière dont vous définissez "vide". J'utilise généralement une méthode d'extension comme celle-ci:

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
la source
1
Je voudrais en faire une méthode d'extension comme: public static bool IsNullOrEmpty (ce jeton JToken) {...} à utiliser comme JToken token = jObject ["param"]; bool empty = token.IsNullOrEmpty ()
Dmitry Pavlov
1
Pourriez-vous pas ToSrtingle JTokenet vérifier IsNullOrWhiteSpace? (Après avoir vérifié le JTokenn'est pas nul bien sûr)
Coops
1
@CodeBlend Cela ne fonctionnera pas pour un objet ou un tableau - les versions sérialisées de ceux qui sont vides sont respectivement {}et [].
Brian Rogers
1
J'ajouterais la vérification de propriété: 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) || (token.Type == JTokenType.Property && ((JProperty) token) .Value.ToString () == string.Empty);
jcmontx
59

Vous pouvez procéder comme suit pour vérifier si une valeur JToken est nulle

JToken token = jObject["key"];

if(token.Type == JTokenType.Null)
{
    // Do your logic
}
Sam Ngugi
la source
3
Exactement ce que je recherchais, en raison de paramètres vides renvoyant un type nul qui passe une comparaison == null typique. Merci!
Tim Tyler
4

Il existe également un type - JTokenType.Undefined.

Ce chèque doit être inclus dans la réponse @Brian Rogers.

token.Type == JTokenType.Undefined
Aleha
la source
1

À partir de C # 7, vous pouvez également utiliser ceci:

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

L'opérateur is vérifie le type et s'il corrige la valeur se trouve à l'intérieur de la variable clients.

Sébastien
la source
0

Essayez quelque chose comme ceci pour convertir JToken en 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
}
l'amour en direct
la source