web-dev-qa-db-ja.com

動的JContainer(JSON.NET)&実行時にプロパティを反復

MVC4/.NET4 WebApiコントローラーアクションでJSON文字列を受信して​​います。アクションのパラメーターはdynamicです。これは、受信しているJSONオブジェクトについて受信側で何も知らないためです。

_ public dynamic Post(dynamic myobject)        
_

JSONは自動的に解析され、結果のdynamicオブジェクトは_Newtonsoft.Json.Linq.JContainer_になります。予想どおり、実行時にプロパティを評価できるため、JSONにmyobject.mypropertyなどが含まれている場合は、受信した動的オブジェクトを取得して、C#コード内で_myobject.myproperty_を呼び出すことができます。ここまでは順調ですね。

次に、ネストされたプロパティを含め、JSONの一部として提供されたすべてのプロパティを反復処理します。ただし、myobject.GetType().GetProperties()を実行すると、探しているプロパティ(JSONの一部)ではなく、_Newtonsoft.Json.Linq.JContainer_のプロパティのみが返されます。

これを行う方法はありますか?

20
Alex

これが出発点になると思います

dynamic dynObj = JsonConvert.DeserializeObject("{a:1,b:2}");

//JContainer is the base class
var jObj = (JObject)dynObj;

foreach (JToken token in jObj.Children())
{
    if (token is JProperty)
    {
        var prop = token as JProperty;
        Console.WriteLine("{0}={1}", prop.Name, prop.Value);
    }
}

[〜#〜]編集[〜#〜]

これも役立つかもしれません

var dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(jObj.ToString());
45
L.B