[C#] Nutzen Sie den Wert von JToken, der möglicherweise nicht existiert (Best Practices)


Answers

Ich würde GetValue wie GetValue schreiben

public static T GetValue<T>(this JToken jToken, string key, T defaultValue = default(T))
{
    dynamic ret = jToken[key];
    if (ret == null) return defaultValue;
    if (ret is JObject) return JsonConvert.DeserializeObject<T>(ret.ToString());
    return (T)ret;
}

Auf diese Weise können Sie nicht nur die Grundtypen, sondern auch komplexe Objekte erhalten. Hier ist ein Beispiel

public class ClassA
{
    public int I;
    public double D;
    public ClassB ClassB;
}
public class ClassB
{
    public int I;
    public string S;
}

var jt = JToken.Parse("{ I:1, D:3.5, ClassB:{I:2, S:'test'} }");

int i1 = jt.GetValue<int>("I");
double d1 = jt.GetValue<double>("D");
ClassB b = jt.GetValue<ClassB>("ClassB");
Question

Was ist die beste Vorgehensweise zum Abrufen von JSON-Werten, die unter Verwendung von Json.NET möglicherweise nicht einmal in C # vorhanden sind ?

Im Moment habe ich es mit einem JSON-Provider zu tun, der JSON zurückgibt, der manchmal bestimmte Schlüssel / Wert-Paare enthält und manchmal nicht. Ich habe diese Methode (vielleicht fälschlicherweise) verwendet, um meine Werte zu erhalten (Beispiel für das Erhalten eines Double):

if(null != jToken["width"])
    width = double.Parse(jToken["width"].ToString());
else
    width = 100;

Nun, das funktioniert gut, aber wenn es viele von ihnen gibt, ist es mühsam. Am Ende habe ich eine Erweiterungsmethode geschrieben und erst nach dem Schreiben habe ich mich gefragt, ob ich vielleicht blöd war ... Wie auch immer, hier ist die Erweiterungsmethode (ich nehme nur Fälle für Doppel und String auf, aber in Wirklichkeit habe ich ziemlich viele Mehr):

public static T GetValue<T>(this JToken jToken, string key,
                            T defaultValue = default(T))
{
    T returnValue = defaultValue;

    if (jToken[key] != null)
    {
        object data = null;
        string sData = jToken[key].ToString();

        Type type = typeof(T);

        if (type is double)
            data = double.Parse(sData);
        else if (type is string)
            data = sData;

        if (null == data && type.IsValueType)
            throw new ArgumentException("Cannot parse type \"" + 
                type.FullName + "\" from value \"" + sData + "\"");

        returnValue = (T)Convert.ChangeType(data, 
            type, CultureInfo.InvariantCulture);
    }

    return returnValue;
}

Und hier ist ein Beispiel für die Verwendung der Erweiterungsmethode:

width = jToken.GetValue<double>("width", 100);

BTW, bitte vergib, was eine wirklich dumme Frage sein könnte, da es scheint, als ob etwas eine eingebaute Funktion für ... sein sollte. Ich habe Google und Json.NET- Dokumentation versucht, aber ich bin entweder unfähig, die Lösung zu finden meine Frage oder es ist nicht klar in der Dokumentation.




Sie können einfach tippen, und es wird die Konvertierung für Sie, z

var with = (double?) jToken[key] ?? 100;

Es wird automatisch null wenn der Schlüssel nicht im Objekt vorhanden ist. Es ist also nicht notwendig, nach dem Schlüssel zu suchen.