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.

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

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
}

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

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.


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
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.