Cómo convertir una matriz Json a una lista de objetos en c #

Tengo cadena Json como a continuación

{ "JsonValues":{ "id": "MyID", "values": { "value1":{ "id": "100", "diaplayName": "MyValue1" }, "value2":{ "id": "200", "diaplayName": "MyValue2" } } } } 

Quiero convertir cadena Json a clases inferiores

  class ValueSet { [JsonProperty("id")] public string id { get; set; } [JsonProperty("values")] public List values { get; set; } } class Value { public string id { get; set; } public string DiaplayName { get; set; } } 

Mi código de deserialización es

 JavaScriptSerializer js = new JavaScriptSerializer(); StreamReader sr = new StreamReader(@"ValueSetJsonString.txt"); string jsonString = sr.ReadToEnd(); var items = JsonConvert.DeserializeObject(jsonString); 

Pero obtengo valores nulos después de la serialización. ¿Cómo puedo resolver esto?

Como ya han señalado otros, la razón por la que no obtiene los resultados que espera es porque su JSON no coincide con la estructura de clase en la que está intentando deserializar. O necesita cambiar su JSON o cambiar sus clases. Como otros ya han demostrado cómo cambiar el JSON, tomaré el enfoque opuesto aquí.

Para que coincida con el JSON que publicó en su pregunta, sus clases deben definirse como las siguientes. Observe que hice los siguientes cambios:

  1. Wrapper una clase Wrapper correspondiente al objeto externo en su JSON.
  2. Cambié la propiedad Values de la clase ValueSet de List a Dictionary ya que la propiedad values en su JSON contiene un objeto, no una matriz.
  3. [JsonProperty] algunos atributos adicionales [JsonProperty] para que coincidan con los nombres de las propiedades en los objetos JSON.

Definiciones de clase:

 class Wrapper { [JsonProperty("JsonValues")] public ValueSet ValueSet { get; set; } } class ValueSet { [JsonProperty("id")] public string Id { get; set; } [JsonProperty("values")] public Dictionary Values { get; set; } } class Value { [JsonProperty("id")] public string Id { get; set; } [JsonProperty("diaplayName")] public string DisplayName { get; set; } } 

Necesita deserializar en la clase Wrapper , no en la clase ValueSet . A continuación, puede obtener el ValueSet de la Wrapper .

 var valueSet = JsonConvert.DeserializeObject(jsonString).ValueSet; 

Aquí hay un progtwig de trabajo para demostrar:

 class Program { static void Main(string[] args) { string jsonString = @" { ""JsonValues"": { ""id"": ""MyID"", ""values"": { ""value1"": { ""id"": ""100"", ""diaplayName"": ""MyValue1"" }, ""value2"": { ""id"": ""200"", ""diaplayName"": ""MyValue2"" } } } }"; var valueSet = JsonConvert.DeserializeObject(jsonString).ValueSet; Console.WriteLine("id: " + valueSet.Id); foreach (KeyValuePair kvp in valueSet.Values) { Console.WriteLine(kvp.Key + " id: " + kvp.Value.Id); Console.WriteLine(kvp.Key + " name: " + kvp.Value.DisplayName); } } } 

Y aquí está el resultado:

 id: MyID value1 id: 100 value1 name: MyValue1 value2 id: 200 value2 name: MyValue2 

http://json2csharp.com/

Encontré el enlace de arriba increíblemente útil ya que corregía mis clases de C # generándolas del JSON que realmente se devolvió.

Luego llamé:

 JsonConvert.DeserializeObject(jsonString); 

y todo funcionó como se esperaba

Su estructura de datos y su JSON no coinciden.

Tu JSON es esto:

 { "JsonValues":{ "id": "MyID", ... } } 

Pero la estructura de datos a la que intenta serializar es esta:

 class ValueSet { [JsonProperty("id")] public string id { get; set; } ... } 

Se está saltando un paso: su JSON es una clase que tiene una propiedad llamada JsonValues , que tiene un objeto de su estructura de datos ValueSet como valor.

También dentro de tu clase tu JSON es este:

 "values": { ... } 

Su estructura de datos es esta:

 [JsonProperty("values")] public List values { get; set; } 

Tenga en cuenta que { .. } en JSON define un objeto, donde como [ .. ] define una matriz. Entonces, de acuerdo con su JSON, no tiene un conjunto de valores, pero tiene one objeto de valores con las propiedades value1 y value2 de tipo Value .

Dado que el deserializador espera una matriz pero obtiene un objeto en su lugar, hace lo menos no destructivo (Excepción) que podría hacer: omitir el valor. Los values su propiedad permanecen con su valor predeterminado: null .

Si puedes: Ajusta tu JSON. Lo siguiente coincidiría con su estructura de datos y probablemente sea lo que realmente desea:

 { "id": "MyID", "values": [ { "id": "100", "diaplayName": "MyValue1" }, { "id": "200", "diaplayName": "MyValue2" } ] } 

tiene una cadena jSon sin igual, si quiere convertirla en una lista, intente esto

 { "id": "MyID", "values": [ { "id": "100", "diaplayName": "MyValue1", }, { "id": "200", "diaplayName": "MyValue2", } ] } 

¿Has comprobado que esta línea funciona a la perfección y tu cadena tiene valor en ella?

string jsonString = sr.ReadToEnd();

Si es así, pruebe este código para la última línea:

ValueSet items = JsonConvert.DeserializeObject(jsonString);

o si tiene una matriz de json, puede usar una lista como esta:

List items = JsonConvert.DeserializeObject>(jsonString);

buena suerte

Esto también es posible:

  using System.Web.Helpers; var listOfObjectsResult = Json.Decode>(JsonData); 

Puede usar el framework Json.Net para hacer esto. Solo así:

Account account = JsonConvert.DeserializeObject(json);

la página de inicio: http://json.codeplex.com/

el documento sobre esto: http://james.newtonking.com/json/help/index.html#