Deserializando JSON con claves dinámicas

Soy bastante nuevo en JSON, y actualmente estoy aprendiendo sobre (de) serialización. Estoy recuperando una cadena JSON de una página web y tratando de deserializarla en un objeto. El problema es que la clave raíz json es estática, pero las claves subyacentes son dinámicas y no puedo anticipar que se deserialicen. Aquí hay un mini ejemplo de la cadena:

{"daily":{"1337990400000":443447,"1338076800000":444693,"1338163200000":452282,"1338249600000":462189,"1338336000000":466626} 

Para otra cadena JSON en mi aplicación, estaba usando un JavascriptSerializer y anticipando las claves usando la estructura de clase. ¿Cuál es la mejor manera de deserializar esta cuerda en un objeto?

En serio, no hay necesidad de ir por la ruta dinámica; utilizar

 var deser = new JavaScriptSerializer() .Deserialize>>(val); var justDaily = deser["daily"]; 

para obtener un diccionario, y luego puede, por ejemplo

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

para obtener las claves presentes y los valores correspondientes.

Puede usar dynamic en .NET 4 o posterior. Por ejemplo, con JSON.NET puedo hacer:

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

Entonces puedes hacer:

 var str = obj.x; 

Sin embargo, no está seguro de cómo manejará las teclas numéricas. Por supuesto, puede usar JObject directamente, por ejemplo:

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

Esto no es conveniente de usar, porque en с # no se puede definir una variable comienza con un número. Agregar prefijo a las teclas.

O prueba esto:

 string json = " { daily:[ { key: '1337990400000', val:443447 }, { key: '1338076800000', val:444693 }, { key: '1338163200000', val:452282 }, { key: '1338249600000', val:462189 }, { key: '1338336000000', val:466626 }] }"; public class itemClass { public string key; // or int public int val; } public class items { public itemClass[] daily; } items daily = (new JavascriptSerializer()).Deserialize(json); 

Entonces tú puedes:

 var itemValue = items.Where(x=>x.key=='1338163200000').Select(x=>x.val).FirstOrDefault();