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.

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

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
}

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

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.


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
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.