131 votes

Tirer de la valeur de JToken qui n'existe peut-être pas (meilleures pratiques)

Quelle est la meilleure pratique pour récupérer des valeurs JSON qui n'existent peut-être même pas en C# à l'aide de Json.NET ?

Pour l'instant, j'ai affaire à un fournisseur JSON qui renvoie un JSON contenant 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 seulement après En écrivant cela, je me suis demandé si je n'étais pas en train d'être stupide... Quoi qu'il en soit, voici la méthode d'extension (je n'inclus que les cas pour le double et la chaîne, mais en réalité j'en ai beaucoup 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);

Pardonnez cette question qui pourrait être stupide, car il semble qu'il devrait y avoir une fonction intégrée pour cela... J'ai essayé Google, et Json.NET Cependant, soit je ne parviens pas à trouver la solution à ma question, soit elle n'est pas claire dans la documentation.

0 votes

Je sais que c'est un peu tard, mais vous pouvez essayer cette version simplifiée de GetValue en dessous de

0 votes

string rootValue = jToken.Value<string>()

1voto

Zhenyang Hua Points 1377

TYPE variable = jsonbody["key"]?.Value<TYPE>() ?? DEFAULT_VALUE;

par exemple

bool attachMap = jsonbody["map"]?.Value<bool>() ?? false;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X