dynamic JContainer (JSON.NET) & Iterate over properties at runtime
I think this can be a starting point
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
this also may help you
var dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(jObj.ToString());
Alex
Updated on July 10, 2022Comments
-
Alex almost 2 years
I'm receiving a JSON string in a MVC4/.NET4 WebApi controller action. The action's parameter is
dynamic
because I don't know anything on the receiving end about the JSON object I'm receiving.public dynamic Post(dynamic myobject)
The JSON is automatically parsed and the resulting
dynamic
object is aNewtonsoft.Json.Linq.JContainer
. I can, as expected, evaluate properties at runtime, so if the JSON contained something like myobject.myproperty then I can now take the dynamic object received and callmyobject.myproperty
within the C# code. So far so good.Now I want to iterate over all properties that were supplied as part of the JSON, including nested properties. However, if I do
myobject.GetType().GetProperties()
it only returns properties ofNewtonsoft.Json.Linq.JContainer
instead of the properties I'm looking for (that were part of the JSON).Any idea how to do this?
-
L.B over 11 years@Alex Then things are getting complicated and you may have to write a recursive function. You should always check JObject,JArray,JProperty etc, Basically you should repeat what
JsonConvert.DeserializeObject<T>
does. -
L.B over 11 years@Alex I guess deserializing to a
Dictionary<string, object>
may help also. See the edit.