1. ホーム
  2. c#

[解決済み] 存在しないかもしれないJTokenから価値を得る(ベストプラクティス)

2022-06-20 10:54:07

質問

C#で、存在しないかもしれないJSON値を Json.NET ?

現在、私は、ある特定のキー/値のペアを含むJSONを返すJSONプロバイダーを扱っていますが、そうでない場合もあります。私は値を取得するために(おそらく間違って)このメソッドを使用してきました(doubleを取得するための例)。

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

今はこれで問題なく動作していますが、数が多くなると面倒です。結局、拡張メソッドを書いて、その中で唯一 の後に を書いた後で、もしかしたら自分はバカだったのかもしれないと思いました。とにかく、これがその拡張メソッドです(doubleとstringのケースしか書いていませんが、実際にはもっとたくさんあります)。

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

そして、拡張メソッドを使った例です。

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

ところで、本当に馬鹿な質問かもしれませんが、内蔵の関数があるはずなので、お許しください。私はGoogleを試してみました。 Json.NET のドキュメントを試してみましたが、私の質問に対する解決策を見つけるのが下手なのか、ドキュメントで明確になっていないのか、どちらかです。

どのように解決するのですか?

これは、かなり一般的なメソッドである Value() はそのためのものです。null可能な値型と組み合わせれば、まさに望む動作が得られます。 ?? 演算子と組み合わせれば、まさに望む動作が得られます。

width = jToken.Value<double?>("width") ?? 100;