In einem JObject nach leerem oder null JToken suchen

89

Ich habe folgendes ...

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

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

JTokenToSql sieht aus wie das...

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

Ich habe es ((JObject)obj).Countauch versucht .. Aber scheint nicht zu funktionieren.

Kyle
quelle

Antworten:

169

Um zu überprüfen, ob eine Eigenschaft für a vorhanden ist JObject, können Sie die Syntax in eckigen Klammern verwenden und feststellen, ob das Ergebnis null ist oder nicht. Wenn die Eigenschaft vorhanden ist, JTokenwird immer a zurückgegeben (auch wenn sie den Wert nullim JSON hat).

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

Wenn Sie ein JTokenin der Hand haben und sehen möchten, ob es nicht leer ist, hängt dies davon ab, um welchen Typ JTokenes sich handelt und wie Sie "leer" definieren. Normalerweise verwende ich eine Erweiterungsmethode wie diese:

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
quelle
1
Ich würde es Erweiterungsmethode wie folgt machen: public static bool IsNullOrEmpty (dieses JToken-Token) {...} wie JToken-Token verwenden = jObject ["param"]; bool empty = token.IsNullOrEmpty ()
Dmitry Pavlov
1
Könnten Sie nicht ToSrtingdas JTokenund überprüfen IsNullOrWhiteSpace? (Nach dem Überprüfen JTokenist das natürlich nicht null)
Coops
1
@CodeBlend Das wird nicht funktionieren für ein Objekt oder ein Array - die serialisierte Versionen von denen , wenn sie leer sind {}und []jeweils.
Brian Rogers
1
Ich würde die Eigenschaftsprüfung hinzufügen: 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
55

Sie können wie folgt vorgehen, um zu überprüfen, ob ein JToken-Wert null ist

JToken token = jObject["key"];

if(token.Type == JTokenType.Null)
{
    // Do your logic
}
Sam Ngugi
quelle
2
Genau das, wonach ich gesucht habe, da leere Parameter einen Nulltyp zurückgeben, der einen typischen == Null-Vergleich besteht. Vielen Dank!
Tim Tyler
4

Es gibt auch einen Typ - JTokenType.Undefined.

Diese Prüfung muss in der Antwort von @Brian Rogers enthalten sein.

token.Type == JTokenType.Undefined
aleha
quelle
1

Ab C # 7 können Sie auch Folgendes verwenden:

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

Der Operator is überprüft den Typ und wenn er korrigiert wird, befindet sich der Wert in der Clientvariablen.

Sebastian
quelle
0

Versuchen Sie so etwas, um JToken in JArray zu konvertieren:

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
}
Live-Liebe
quelle