[解決済み] 存在しないかもしれない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;
関連
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み] リフレクションを使用して文字列からプロパティ値を取得する
-
[解決済み] C#でenumからint値を取得する
-
[解決済み] LINQ を使用して、ある List<> にある項目を別の List<> にない項目として取得する。
-
[解決済み] 文字列をNULL可能な型に変換する(int, double, etc...)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】WPFでXamlファイルにコメントを追加する方法は?
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み] 2つのリストを結合する
-
[解決済み】2年前のMSDateを把握する【クローズド
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】Microsoft.Extensions.LoggingからILoggerを解決することができない
-
[解決済み】WebResource.axdとは何ですか?