none
Como Convertir un Arreglo JSON en List<T> ?

    Pregunta

  • hola  ::

    En el servidor devuelvo un string que  obtengo de esta manera :

    public string  GetCliente()
            {
                string resultado = string.Empty;
                DataTable dt = new DataTable();
                dt = Engine.FuncionesDb.TableDataCliente();
                List<Cliente> Customer = new List<Cliente>();
                if (dt.Rows.Count == 0)
                {
                    return resultado;
                }
                else
                {
                 Customer = SetListaCliente(dt);
                 resultado = new JavaScriptSerializer().Serialize(Customer);
                }
    
                return resultado;
            }
    
    
            private List<Cliente> SetListaCliente (DataTable dt)
            {
                List<Cliente> Customer = new List<Cliente>();
                foreach (DataRow r in dt.Rows)
                {
                    Cliente lineaCliente = new Cliente
                    {
                        Numero = Convert.ToInt32(r[0]),
                        Id = r[1].ToString(),
                        Nombre = r[2].ToString(),
                        Edad = Convert.ToInt32(r[3]),
                        Telefono = r[4].ToString(),
                        Mail = r[5].ToString(),
                        Saldo = Convert.ToDouble(r[6]),
                        FechaCreacion = Convert.ToDateTime(r[7]),
                        FechaCreacionUtc = Convert.ToDateTime(r[8]),
                        FechaModificacion = Convert.ToDateTime(r[9]),
                        FechaModificacionUtc = Convert.ToDateTime(r[10]),
                        Proceso = Convert.ToInt32(r[11]),
                        Usuario = r[12].ToString(),
                        Estado = r[13].ToString(),
                    };
                    Customer.Add(lineaCliente);
                }
                return Customer;
            } 

    y en el cliente

     private string ClientGetRequest(string RequestURI)
            {
                string resultado = string.Empty;
                HttpClient client = new HttpClient();
                client.BaseAddress = new Uri("http://localhost:50445/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                HttpResponseMessage response = new HttpResponseMessage();
                response = client.GetAsync(RequestURI).Result;
                if (response.IsSuccessStatusCode)
                {
                    resultado = response.Content.ReadAsStringAsync().Result;
    
                     List <Cliente> jsonClientes = JsonConvert.DeserializeObject<List<Cliente>>(resultado);          }
                else
                {
                    resultado = response.IsSuccessStatusCode.ToString();
                }
    
                return resultado;
            }

    y me devuelve este error  :

    Newtonsoft.Json.JsonSerializationException:

    +        $exception    {"Error converting value \"[{\"Numero\":2,\"Id\":\"1eddb545-6811-44f3-b1d2-f379792aff3d\",

    \"Nombre\":\"Xiomara Telleria\",\"Edad\":25,\"Telefono\":\"0414-23446789\",

    \"Mail\":\"xiomara@cantv.com\",\"Saldo\":12345345.678,

    \"FechaCreacion\":\"\\/Date(1533672651770)\\/\",

    \"FechaCreacionUtc\":\"\\/Date(1533687051770)\\/\",

    \"FechaModificacion\":\"\\/Date(1533672651770)\\/\",

    \"FechaModificacionUtc\":\"\\/Date(1533687051770)\\/\",

    \"Proceso\":0,\"Usuario\":\"Efrain\",\"Estado\":\"ACTIVO\"},

    {\"Numero\":1,\"Id\":\"85f9a04d-5406-4243-91e0-fef0c6c60a14\",

    \"Nombre\":\"Mariana Martinez\",\"Edad\":22,\"Telefono\":\"0416-23446789\",

    \"Mail\":\"mariana@cantv.com\",\"Saldo\":1234.678,

    \"FechaCreacion\":\"\\/Date(1533672607013)\\/\",

    \"FechaCreacionUtc\":\"\\/Date(1533687007017)\\/\",

    \"FechaModificacion\":\"\\/Date(1533672607017)\\/\",

    \"FechaModificacionUtc\":\"\\/Date(1533687007017)\\/\",

    \"Proceso\":0,\"Usuario\":\"Efrain\",\"Estado\":\"ACTIVO\"}]\"

    to type 'System.Collections.Generic.List`1[ApiRestConsumer.Form1+Cliente]'.

    Path '', line 1, position 913."}    Newtonsoft.Json.JsonSerializationException



    EFRAIN MEJIAS C VALENCIA - VENEZUELA


    viernes, 10 de agosto de 2018 9:54

Respuestas

  • hola

    A simple vista no veo nada incorrecto, salvo el hecho de usar un datatable en luegar de un datareader

    Si pones un breakpoint en el cliente y tomas el valor de la variable resultado, y la llevas a

    http://json2csharp.com/

    te genera una clase con la misma estructura a la cual quiere deserializar?

    Lo que se me ocurre es que la clase Cliente que defines en el form sea muy distinta a la clase que defines al serializar o que cambie algun tipo de dato

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    viernes, 10 de agosto de 2018 11:55
  • Hola. Viendo tu Json, efectivamente las fechas estan en formato Epoch (formato Unix time). Necesitas implementar un DateTimeConverter y establecerlo como atributo en tus propiedades de tipo fecha. Aqui te dejo un ejemplo 

    class Bookmark
    {
        public string title;
        public long id;
        [JsonConverter(typeof(MicrosecondEpochConverter))]
        public DateTime dateAdded;
        [JsonConverter(typeof(MicrosecondEpochConverter))]
        public DateTime lastModified;
        public string type;
        public string root;
        public long parent;
        public List<Bookmark> children;
        public string uri;
    
        public override string ToString()
        {
            return string.Format("{0} - {1}", title, uri);
        }
    }
    
    public class MicrosecondEpochConverter : DateTimeConverterBase
    {
        private static readonly DateTime _epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            writer.WriteRawValue(((DateTime)value - _epoch).TotalMilliseconds + "000");
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.Value == null) { return null; }
            return _epoch.AddMilliseconds((long)reader.Value / 1000d);
        }
    }
    
    internal class Program
    {
    
        private static void Main(string[] args)
        {
            var jsonString = File.ReadAllText(@"T:/bookmarks-2013-11-13.json");
            var rootMark = JsonConvert.DeserializeObject<Bookmark>(jsonString);
            var ret = JsonConvert.SerializeObject(rootMark);
        }
    }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    viernes, 10 de agosto de 2018 22:52
    Moderador
  • resultado = response.Content.ReadAsStringAsync().Result;

    Si lo veo como JSON

    [JSON]: "[{"Numero":4,"Id":"487e94a5-aebe-4f6d-9cea-34eff9987b50","Nombre":"DANIELIZ SAAVEDRA","Edad":35,"Telefono":"0424-4747799","Mail":"danielizbella@yahoo.com","Saldo":98765234.89,"FechaCreacion":"\/Date(1533932441983)\/","FechaCreacionUtc":"\/Date(1533957641983)\/","FechaModificacion":"\/Date(1533932441983)\/","FechaModificacionUtc":"\/Date(1533957641983)\/","Proceso":0,"Usuario":"EFRAIN","Estado":"ACTIVO"},

    {"Numero":5,"Id":"f510fc52-46a0-43b5-9f4f-7996725699e1","Nombre":"Carlos Miguel","Edad":46,"Telefono":"0424-4325677","Mail":"carlos_miguel@fantasma.com","Saldo":893456789.925,"FechaCreacion":"\/Date(1533934538860)\/","FechaCreacionUtc":"\/Date(1533959738860)\/","FechaModificacion":"\/Date(1533934757653)\/","FechaModificacionUtc":"\/Date(1533959957653)\/","Proceso":0,"Usuario":"EFRAIN","Estado":"ACTIVO"},

    {"Numero":2,"Id":"cdb3be07-f20c-4ec5-8591-9dff1d0c4eeb","Nombre":"JOSE JOSE","Edad":27,"Telefono":"0414-0898965","Mail":"josejose@yahoo.com","Saldo":6534,"FechaCreacion":"\/Date(1533932273693)\/","FechaCreacionUtc":"\/Date(1533957473693)\/","FechaModificacion":"\/Date(1533943962783)\/","FechaModificacionUtc":"\/Date(1533958362783)\/","Proceso":0,"Usuario":"MARIA2","Estado":"ACTIVO"},

    {"Numero":1,"Id":"ece7ba2e-2ecb-4465-aa07-a3a605454aa7","Nombre":"Marta Carolina","Edad":29,"Telefono":"0241-8316318","Mail":"mc_martinez@outlook.com","Saldo":9999999,"FechaCreacion":"\/Date(1533932220417)\/","FechaCreacionUtc":"\/Date(1533957420417)\/","FechaModificacion":"\/Date(1533943808077)\/","FechaModificacionUtc":"\/Date(1533958208077)\/","Proceso":0,"Usuario":"CARLO","Estado":"ACTIVO"},

    {"Numero":3,"Id":"8f199011-46b3-4f11-8c50-a4912688da07","Nombre":"MARY ANGEl","Edad":30,"Telefono":"0416-0898345","Mail":"mary_098@yahoo.com","Saldo":123456,"FechaCreacion":"\/Date(1533932335847)\/","FechaCreacionUtc":"\/Date(1533957535847)\/","FechaModificacion":"\/Date(1533932335847)\/","FechaModificacionUtc":"\/Date(1533957535847)\/","Proceso":0,"Usuario":"EFRAIN","Estado":"ACTIVO"},

    {"Numero":6,"Id":"b542f919-6783-4a06-89f9-c64dd76beec8","Nombre":"Efrain Mejias C","Edad":46,"Telefono":"0424-4133677","Mail":"emcingenieriadesoftware@outlook.com","Saldo":890456123.987,"FechaCreacion":"\/Date(1533934927130)\/","FechaCreacionUtc":"\/Date(1533960127130)\/","FechaModificacion":"\/Date(1533934977030)\/","FechaModificacionUtc":"\/Date(1533960177030)\/","Proceso":0,"Usuario":"CASTILLO","Estado":"ACTIVO"}]"


    EFRAIN MEJIAS C VALENCIA - VENEZUELA


    viernes, 10 de agosto de 2018 21:13
  • hola ...

    Solucione con este link

    https://blog.kulman.sk/custom-datetime-deserialization-with-json-net/


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    martes, 14 de agosto de 2018 17:37

Todas las respuestas

  • hola

    A simple vista no veo nada incorrecto, salvo el hecho de usar un datatable en luegar de un datareader

    Si pones un breakpoint en el cliente y tomas el valor de la variable resultado, y la llevas a

    http://json2csharp.com/

    te genera una clase con la misma estructura a la cual quiere deserializar?

    Lo que se me ocurre es que la clase Cliente que defines en el form sea muy distinta a la clase que defines al serializar o que cambie algun tipo de dato

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    viernes, 10 de agosto de 2018 11:55
  • Las clases estan iguales del lado del cliente como del lado del servidor ,  y en el sitio web me devuelve igual a la que tengo....

    Si pones algu ejemplo con datareader seria estupedo


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    viernes, 10 de agosto de 2018 12:33
  • Voy a decir una tontería, per me da la impresión de que el JSON que te está llegando no es una lista de objetos, sino un string que dentro contiene JSON y ese JSON es la lista de objetos que hay que deserializar. Lo digo porque en el mensaje de error aparece encerrado entre comillas, y todas las comillas del interior aparecen escapadas con una contrabarra. Puede que esto sea solo un artefacto del mecanismo que usas para mostrar la excepción, pero por si acaso no estaría de más verificarlo con el debugger. Lo digo porque por lo demás la estructura recibida parece correcta, y en teoría debería deserializarse correctamente.
    viernes, 10 de agosto de 2018 12:34
    Moderador
  • Yo tampoco encuentro ningún problema, es más he probado deserializar el string json que muestras y lo ha hecho sin chistar.

    Hay un par de cuestiones con el código. El scope de jsonClientes, y la manera que usas los métodos blablaAsyc "concatenados" con la propiedad Result. Imagino que esto último es cómodo para el programador, pero no es asincrónico.



    viernes, 10 de agosto de 2018 14:13
  • resultado = response.Content.ReadAsStringAsync().Result;
    
                     

    Hola, puedes mostrarnos el contenido de la variable resultado después de ejecutar esta linea?


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    viernes, 10 de agosto de 2018 18:49
    Moderador
  • resultado = response.Content.ReadAsStringAsync().Result;

    Si lo veo como JSON

    [JSON]: "[{"Numero":4,"Id":"487e94a5-aebe-4f6d-9cea-34eff9987b50","Nombre":"DANIELIZ SAAVEDRA","Edad":35,"Telefono":"0424-4747799","Mail":"danielizbella@yahoo.com","Saldo":98765234.89,"FechaCreacion":"\/Date(1533932441983)\/","FechaCreacionUtc":"\/Date(1533957641983)\/","FechaModificacion":"\/Date(1533932441983)\/","FechaModificacionUtc":"\/Date(1533957641983)\/","Proceso":0,"Usuario":"EFRAIN","Estado":"ACTIVO"},

    {"Numero":5,"Id":"f510fc52-46a0-43b5-9f4f-7996725699e1","Nombre":"Carlos Miguel","Edad":46,"Telefono":"0424-4325677","Mail":"carlos_miguel@fantasma.com","Saldo":893456789.925,"FechaCreacion":"\/Date(1533934538860)\/","FechaCreacionUtc":"\/Date(1533959738860)\/","FechaModificacion":"\/Date(1533934757653)\/","FechaModificacionUtc":"\/Date(1533959957653)\/","Proceso":0,"Usuario":"EFRAIN","Estado":"ACTIVO"},

    {"Numero":2,"Id":"cdb3be07-f20c-4ec5-8591-9dff1d0c4eeb","Nombre":"JOSE JOSE","Edad":27,"Telefono":"0414-0898965","Mail":"josejose@yahoo.com","Saldo":6534,"FechaCreacion":"\/Date(1533932273693)\/","FechaCreacionUtc":"\/Date(1533957473693)\/","FechaModificacion":"\/Date(1533943962783)\/","FechaModificacionUtc":"\/Date(1533958362783)\/","Proceso":0,"Usuario":"MARIA2","Estado":"ACTIVO"},

    {"Numero":1,"Id":"ece7ba2e-2ecb-4465-aa07-a3a605454aa7","Nombre":"Marta Carolina","Edad":29,"Telefono":"0241-8316318","Mail":"mc_martinez@outlook.com","Saldo":9999999,"FechaCreacion":"\/Date(1533932220417)\/","FechaCreacionUtc":"\/Date(1533957420417)\/","FechaModificacion":"\/Date(1533943808077)\/","FechaModificacionUtc":"\/Date(1533958208077)\/","Proceso":0,"Usuario":"CARLO","Estado":"ACTIVO"},

    {"Numero":3,"Id":"8f199011-46b3-4f11-8c50-a4912688da07","Nombre":"MARY ANGEl","Edad":30,"Telefono":"0416-0898345","Mail":"mary_098@yahoo.com","Saldo":123456,"FechaCreacion":"\/Date(1533932335847)\/","FechaCreacionUtc":"\/Date(1533957535847)\/","FechaModificacion":"\/Date(1533932335847)\/","FechaModificacionUtc":"\/Date(1533957535847)\/","Proceso":0,"Usuario":"EFRAIN","Estado":"ACTIVO"},

    {"Numero":6,"Id":"b542f919-6783-4a06-89f9-c64dd76beec8","Nombre":"Efrain Mejias C","Edad":46,"Telefono":"0424-4133677","Mail":"emcingenieriadesoftware@outlook.com","Saldo":890456123.987,"FechaCreacion":"\/Date(1533934927130)\/","FechaCreacionUtc":"\/Date(1533960127130)\/","FechaModificacion":"\/Date(1533934977030)\/","FechaModificacionUtc":"\/Date(1533960177030)\/","Proceso":0,"Usuario":"CASTILLO","Estado":"ACTIVO"}]"


    EFRAIN MEJIAS C VALENCIA - VENEZUELA


    viernes, 10 de agosto de 2018 21:13
  • Hola, puedes mostrarnos la estructura de tu clase Cliente? Para ver si hay algun dato que no se deserialice bien, como los campos de tipo Fecha 

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    viernes, 10 de agosto de 2018 21:49
    Moderador
  • Hola. Viendo tu Json, efectivamente las fechas estan en formato Epoch (formato Unix time). Necesitas implementar un DateTimeConverter y establecerlo como atributo en tus propiedades de tipo fecha. Aqui te dejo un ejemplo 

    class Bookmark
    {
        public string title;
        public long id;
        [JsonConverter(typeof(MicrosecondEpochConverter))]
        public DateTime dateAdded;
        [JsonConverter(typeof(MicrosecondEpochConverter))]
        public DateTime lastModified;
        public string type;
        public string root;
        public long parent;
        public List<Bookmark> children;
        public string uri;
    
        public override string ToString()
        {
            return string.Format("{0} - {1}", title, uri);
        }
    }
    
    public class MicrosecondEpochConverter : DateTimeConverterBase
    {
        private static readonly DateTime _epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            writer.WriteRawValue(((DateTime)value - _epoch).TotalMilliseconds + "000");
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.Value == null) { return null; }
            return _epoch.AddMilliseconds((long)reader.Value / 1000d);
        }
    }
    
    internal class Program
    {
    
        private static void Main(string[] args)
        {
            var jsonString = File.ReadAllText(@"T:/bookmarks-2013-11-13.json");
            var rootMark = JsonConvert.DeserializeObject<Bookmark>(jsonString);
            var ret = JsonConvert.SerializeObject(rootMark);
        }
    }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    viernes, 10 de agosto de 2018 22:52
    Moderador
  • Mi anterior respuesta esta basada en https://stackoverflow.com/questions/19971494/how-to-deserialize-a-unix-timestamp-%ce%bcs-to-a-datetime

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    viernes, 10 de agosto de 2018 22:53
    Moderador
  • Hola Sergio Parra

    En mi clase Modifique   los datatime a algo asi y agregue tu clase   

     [JsonConverter(typeof(MicrosecondEpochConverter))]
      public DateTime FechaCreacion { get; set; }

    y agregue tu clase MicrosecondEpochConverter : DateTimeConverterBase y pude deserializar mi json

      List<Cliente> json = JsonConvert.DeserializeObject<List<Cliente>>(resultado)

    pero los atributos fechas quedaron  01/01/0001 0:00:00  no el valor que deberian tener

    Como resuelvo esto ???


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    lunes, 13 de agosto de 2018 23:42
  • hola ...

    Solucione con este link

    https://blog.kulman.sk/custom-datetime-deserialization-with-json-net/


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    martes, 14 de agosto de 2018 17:37