Deserializing JSON with dynamic keys

Whenever you have JSON with dynamic keys it can usually be deserialized into a Dictionary<string, SomeObject>. Since the inner JSON keys are dynamic (in this question) the JSON can be modelled as:

Dictionary<string, Dictionary<string, int>>

I would recommend using NewtonSoft.Json (JSON.Net) or System.Text.Json (if you're working in .NET-Core 3.0 and up).

Newtonsoft.Json

Use DeserializeObject<T> from JsonConvert:

var response = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, int>>>(json);

System.Text.Json

Use Deserialize<T> from JsonSerializer:

var response = JsonSerializer.Deserialize<Dictionary<string, Dictionary<string, int>>>(json);

Seriously, no need to go down the dynamic route; use

var deser = new JavaScriptSerializer()
    .Deserialize<Dictionary<string, Dictionary<string, int>>>(val);
var justDaily = deser["daily"];

to get a dictionary, and then you can e.g.

foreach (string key in justDaily.Keys)
    Console.WriteLine(key + ": " + justDaily[key]);

to get the keys present and the corresponding values.


You can use dynamic in .NET 4 or later. For example with JSON.NET I can do:

dynamic obj = JsonConvert.Deserialize<dynamic>("{x: 'hello'}");

You can then do:

var str = obj.x;

However, unsure how it will handle numeric keys. You can of course just use JObject directly itself, for example:

var obj = JObject.Parse("{'123456': 'help'}");
var str = obj["123456"];