JSON文字列があります。匿名オブジェクトが含まれているかどうかを確認したい。存在する場合は、値を返します。そうでない場合は、デフォルト値を返します。次に、さまざまな匿名オブジェクトに対してこれを複数回繰り返すことができるようにしたいと考えています。
これは私が現在実装しているコードのサンプルですが、明らかに毎回複製されており、あまり「クリーン」ではありません。
var displayDataBy = 0;
var displayDataByDefinition = new { DisplayDataBy = new { Key = "string", Value = displayDataBy } };
var displayDataByResult = JsonConvert.DeserializeAnonymousType(this.OhdContentPageParameters, displayDataByDefinition);
try { displayDataBy = displayDataByResult.DisplayDataBy.Value; }
catch { }
var xMinsOeeToShow = 480;
var xMinsOeeToShowDefinition = new { XMinsOeeToShow = new { Key = "string", Value = xMinsOeeToShow } };
var xMinsOeeToShowResult = JsonConvert.DeserializeAnonymousType(this.OhdContentPageParameters, xMinsOeeToShowDefinition);
try { xMinsOeeToShow = xMinsOeeToShowResult.XMinsOeeToShow.Value; }
catch { }
匿名型ごとに呼び出すことができる汎用メソッドであることが望ましいです。また、try/catch に頼る必要がないのもいいでしょう。それはできますか?
アップデート...
これは、int、bool、および double に対してうまく機能します。
public static T2 DeserializeValue<T, T2>(this string json, T definition, T2 defaultValue, Func<T, T2?> getValueFunc) where T2 : struct
{
var jsonAnon = JsonConvert.DeserializeAnonymousType(json, definition);
return getValueFunc(jsonAnon) ?? defaultValue;
}
文字列にこれを追加しました:
public static string DeserializeStringValue<T>(this string json, T definition, string defaultValue, Func<T, string> getValueFunc)
{
var jsonAnon = JsonConvert.DeserializeAnonymousType(json, definition);
return getValueFunc(jsonAnon) ?? defaultValue;
}