Principales respuestas
Problema con JSON. Cannot deserialize the current JSON array(e.g [1,2,3] into type

Pregunta
-
Hola a todos/as
Tengo un problema al leer un objeto JSON y se interpretar el error que me sale. Os pongo el código que tengo a ver si veis algo raro:
Entidad:
public class Template { public Template() { this.Objects = new HashSet<AMObject>(); //this.Gama_Apply = new HashSet<Gama_Apply>(); this.Templates_Struct = new HashSet<Templates_Struct>(); this.Templates_Struct1 = new HashSet<Templates_Struct>(); } [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int ID { get; set; } public Nullable<int> IDClient { get; set; } public string Name { get; set; } public string Description { get; set; } public string Ver { get; set; } public virtual ICollection<AMObject> Objects { get; set; } public virtual ICollection<Templates_Struct> Templates_Struct { get; set; } public virtual ICollection<Templates_Struct> Templates_Struct1 { get; set; } public virtual Templates_Properties Templates_Properties { get; set; } }
Repository:
public class Templates { public IList<Template> GetTemplates() { using (var ctx = new DBAssetsContext()) { var lista = ctx.Templates.ToList(); return lista; } } (. . .)
Service:
public class TemplateService { private readonly Repository.Templates te = new Templates(); public IList<Template> GetTemplates() { return te.GetTemplates(); } (. . .)
Controller:
public class TemplateController : ApiController { private readonly TemplateService ts = new TemplateService(); [HttpGet] [Route("Template/getTemplates")] public IList<Template> GetTemplates() { return ts.GetTemplates(); } (. . .)
Client:
public async Task<Template> GetTemplates() { using (var client = new HttpClient()) { try { client.BaseAddress = new Uri(ConfigurationManager.AppSettings["BaseURI"].ToString()); client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Get, "Template/getTemplates"); HttpResponseMessage response = client.SendAsync(message).GetAwaiter().GetResult(); if (response.IsSuccessStatusCode) { Template template = await response.Content.ReadAsAsync<Template>(); //AQUI ES DONDE ME SACA EL ERROR!!!! return template; } else { log.Error("Ha habido algún problema al recuperar los datos de las Templates (Client)"); return null; } } catch (Exception ex ) { Console.WriteLine(ex.Message.ToString()); log.Info(ex.Message); } return null; } }
En el Client, en la línea <i>Template template = await response.Content.ReadAsAsync<Template>();
</i>
es donde me saca el error y no se interpretarlo o qué hacer. Comentar también que la linea
HttpResponseMessage response = client.SendAsync(message).GetAwaiter().GetResult();
la he tenido que poner así ya que si ponía
HttpResponseMessage response = await client.SendAsync(message);
me daba error.
El error que me da ahora es: Cannot deserialize the current JSON array (e.g [1,2,3] into type Template because the type requires a JSON object (e.g {"name":"value"})
Podríais decirme qué estoy haciendo mal??
Gracias y saludos!
- Editado CrepuX viernes, 22 de junio de 2018 9:53 aclarar error
Respuestas
-
No sé si tendrá otros errores. El error particular que ha descrito en detalle (con mensaje de error incluido), se debe a que el servidor devuelve una lista de objetos Template, no un único Template.
En el cliente debe declarar la función así:
public async Task<List<Template>> GetTemplates()
Y en la línea que da error, cambiar a:
List<Template> templates = await response.Content.ReadAsAsync<List<Template>>();
Note que renombré la variable template a templates puesto que es una lista (plural).
Jose R. MCP
My GIT Repositories | Mis Repositorios GIT- Marcado como respuesta CrepuX viernes, 22 de junio de 2018 11:40
Todas las respuestas
-
No sé si tendrá otros errores. El error particular que ha descrito en detalle (con mensaje de error incluido), se debe a que el servidor devuelve una lista de objetos Template, no un único Template.
En el cliente debe declarar la función así:
public async Task<List<Template>> GetTemplates()
Y en la línea que da error, cambiar a:
List<Template> templates = await response.Content.ReadAsAsync<List<Template>>();
Note que renombré la variable template a templates puesto que es una lista (plural).
Jose R. MCP
My GIT Repositories | Mis Repositorios GIT- Marcado como respuesta CrepuX viernes, 22 de junio de 2018 11:40
-
-
Funcionó!! Muchísimas gracias por su ayuda. Como le comentaba, lo que me exponía en el segundo bloque, lo había probado, pero no correctamente. Solo cambié esta parte:
await response.Content.ReadAsAsync<List<Template>>();
Sin darme cuenta de la parte izda de la asignación tenía puesto: Template template en vez de la lista.
De nuevo muchas gracias y saludos!