2012-11-30 10 views
17

MVC4/.NET4 WebApiコントローラアクションでJSON文字列を受け取りました。アクションのパラメータはdynamicです。私が受け取っているJSONオブジェクトについて受信側で何も知らないのでです。動的JContainer(JSON.NET)&実行時にプロパティを反復する

public dynamic Post(dynamic myobject)   

JSONは自動的に解析され、得られたdynamicオブジェクトがNewtonsoft.Json.Linq.JContainerあります。実行時にJSONにmyobject.mypropertyのようなものが含まれていれば、受け取った動的オブジェクトを取得してmyobject.mypropertyをC#コード内で呼び出すことができます。ここまでは順調ですね。

ここでは、ネストされたプロパティを含め、JSONの一部として提供されたすべてのプロパティについて繰り返したいと思います。しかし、私がmyobject.GetType().GetProperties()を実行すると、それは私が探しているプロパティ(JSONの一部である)の代わりにNewtonsoft.Json.Linq.JContainerというプロパティのみを返します。

どうすればいいですか?

+0

役立つかもしれない、これは

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

EDIT

出発点とすることができると思います.com/Supporting-different-data-b0351c9a)の記事は、彼が 'DeserializeRequest'メソッドでやっていることを調べるのに役立ちます。 –

答えて

38

私は、これがまた、[この](http://code.msdn.microsoftあなた

var dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(jObj.ToString()); 
+0

ありがとう! JSONがネストされている場合、これはどのように機能しますか? – Alex

+1

@Alexその後、状況が複雑になり、再帰関数を記述する必要が生じるかもしれません。あなたは常にJObject、JArray、JPropertyなどをチェックする必要があります。基本的には 'JsonConvert.DeserializeObject 'と同じことを繰り返す必要があります。 –

+2

@Alex私は 'Dictionary 'へのデシリアライズも役に立つでしょう。編集を参照してください。 –

関連する問題