Quelle est la meilleure pratique pour récupérer des valeurs JSON qui n'existent même pas en C # à l'aide de Json.NET ?
Pour le moment, j'ai affaire à un fournisseur JSON qui renvoie JSON qui contient parfois certaines paires clé / valeur, et parfois non. J'ai utilisé (peut-être incorrectement) cette méthode pour obtenir mes valeurs (exemple pour obtenir un double):
if(null != jToken["width"])
width = double.Parse(jToken["width"].ToString());
else
width = 100;
Maintenant cela fonctionne bien, mais quand il y en a beaucoup, c'est encombrant. J'ai fini par écrire une méthode d'extension, et ce n'est qu'après l'avoir écrite que je me suis demandé si j'étais peut-être stupide ... de toute façon, voici la méthode d'extension (je n'inclus que des cas pour double et string, mais en réalité j'en ai pas mal plus):
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;
}
Et voici un exemple d'utilisation de la méthode d'extension:
width = jToken.GetValue<double>("width", 100);
BTW, veuillez pardonner ce qui peut être une question vraiment stupide, car il semble qu'il devrait y avoir une fonction intégrée pour ... J'ai essayé la documentation Google et Json.NET , mais je suis soit incapable de trouver la solution à ma question ou ce n'est pas clair dans la documentation.
GetValue
ciRéponses:
C'est à peu près à quoi
Value()
sert la méthode générique . Vous obtenez exactement le comportement souhaité si vous le combinez avec des types de valeur Nullable et l'??
opérateur:la source
jToken
c'est le casnull
, mais ce n'est pas ce que la question a posée. Et vous pouvez facilement corriger cela en utilisant le nul opérateur conditionnel:width = jToken?.Value<double?>("width") ?? 100;
.JToken.Value<T>
lève une exception si le JToken est un JValueJ'écrirais
GetValue
comme ci-dessousDe cette façon, vous pouvez obtenir la valeur non seulement des types de base, mais également des objets complexes. Voici un échantillon
la source
retrieving JSON values that may not even exist
et tout ce que j'ai proposé était de changer votreGetValue
méthode. Je pense que cela fonctionne comme vous le souhaitezVoici comment vous pouvez vérifier si le jeton existe:
Il vérifie si "Items" existe dans "Result".
Ceci est un exemple qui ne fonctionne PAS qui provoque une exception:
la source
Vous pouvez simplement faire un typage, et il effectuera la conversion pour vous, par exemple
Il retournera automatiquement
null
si ladite clé n'est pas présente dans l'objet, il n'est donc pas nécessaire de la tester.la source
TYPE variable = jsonbody["key"]?.Value<TYPE>() ?? DEFAULT_VALUE;
par exemple
bool attachMap = jsonbody["map"]?.Value<bool>() ?? false;
la source
Cela prend en charge les valeurs nulles
la source