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

  • 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
    viernes, 22 de junio de 2018 9:19

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
    viernes, 22 de junio de 2018 10:48
    Moderador

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
    viernes, 22 de junio de 2018 10:48
    Moderador
  • Hola Jose, 

    Muchas gracias por responder. Buceando por Intenet, había visto lo que me expone en su segundo bloque de código y lo había probado; pero no ví lo que me describe en el primer bloque. Lo pruebo a ver y lo comento.

    Saludos!

    viernes, 22 de junio de 2018 10:53
  • 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!

    viernes, 22 de junio de 2018 12:03