Was ist die beste Vorgehensweise zum Abrufen von JSON-Werten, die möglicherweise nicht einmal in C # mit Json.NET vorhanden sind? ?
Im Moment habe ich es mit einem JSON-Anbieter zu tun, der JSON zurückgibt, das manchmal bestimmte Schlüssel / Wert-Paare enthält und manchmal nicht. Ich habe diese Methode (möglicherweise falsch) verwendet, um meine Werte abzurufen (Beispiel für das Abrufen eines Double):
if(null != jToken["width"])
width = double.Parse(jToken["width"].ToString());
else
width = 100;
Das funktioniert gut, aber wenn es viele gibt, ist es umständlich. Am Ende habe ich eine Erweiterungsmethode geschrieben, und erst nachdem ich sie geschrieben habe, habe ich mich gefragt, ob ich vielleicht dumm war ... hier ist die Erweiterungsmethode (ich schließe nur Fälle für Double und String ein, aber in Wirklichkeit habe ich einige 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);
Übrigens, bitte verzeihen Sie, was eine wirklich dumme Frage sein kann, da es so aussieht, als ob es eine eingebaute Funktion für ... geben sollte. Ich habe Google und die Json.NET- Dokumentation ausprobiert , bin jedoch entweder nicht in der Lage , die Lösung für diese zu finden meine Frage oder es ist nicht klar in der Dokumentation.
GetValue
unten ausprobierenAntworten:
Dies ist so ziemlich das, wofür die generische Methode
Value()
ist. Sie erhalten genau das gewünschte Verhalten, wenn Sie es mit nullbaren Werttypen und dem??
Operator kombinieren :quelle
jToken
istnull
, aber das ist nicht das, was die Frage gestellt hat. Und Sie können dies leicht beheben, indem Sie den Null-Bedingungsoperator verwenden :width = jToken?.Value<double?>("width") ?? 100;
.JToken.Value<T>
löst eine Ausnahme aus, wenn das JToken ein JValue istIch würde
GetValue
wie folgt schreibenAuf diese Weise können Sie nicht nur den Wert der Basistypen, sondern auch komplexer Objekte ermitteln. Hier ist ein Beispiel
quelle
retrieving JSON values that may not even exist
und alles, was ich vorgeschlagen habe, war, IhreGetValue
Methode zu ändern . Ich denke, es funktioniert so, wie Sie wollenSo können Sie überprüfen, ob das Token vorhanden ist:
Es wird geprüft, ob "Items" in "Result" vorhanden ist.
Dies ist ein NICHT funktionierendes Beispiel, das eine Ausnahme verursacht:
quelle
Sie können einfach typisieren und es wird die Konvertierung für Sie durchführen, z
Es wird automatisch zurückgegeben,
null
wenn der Schlüssel nicht im Objekt vorhanden ist, sodass kein Test erforderlich ist.quelle
TYPE variable = jsonbody["key"]?.Value<TYPE>() ?? DEFAULT_VALUE;
z.B
bool attachMap = jsonbody["map"]?.Value<bool>() ?? false;
quelle
Dies kümmert sich um Nullen
quelle