none
newton json formato fecha no aceptado RRS feed

  • Pregunta

  • Hola!

    Tengo que consuir un api rest creado en django y cuando voy a enviar un objeto json, me da un error indicado que el formato de fecha ha de ser:    yyyy-MM-dd   ¿como puedo indicar al json que el formato sea ese?

    cuando inspecciono el objeto yo veo fecha: dd-mm-yyyyy     y por eso me da el error,  pero no se como indicar a json que o acepte otro formado o como cabiar yo 

    Un saludo

    martes, 11 de febrero de 2020 14:19

Respuestas

Todas las respuestas

  • hola

    >>Tengo que consuir un api rest creado en django

    intentaste invocar la api rest desde postman? si es asi como le pasas la fecha

    siempre se invoca el api desde una tool para despues llevarlo a codigo

    >>me da un error indicado que el formato de fecha ha de ser:    yyyy-MM-dd   ¿como puedo indicar al json que el formato sea ese?

    como generas el json? es una clase que serializas usando json.net

    Serializing Dates in JSON

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 11 de febrero de 2020 15:17
  • Hola y gracias por responder..... yo desde Insomnia me funciona bien el método post, pero claro, el método ya tiene el formayo en yyyy-mm-dd, te pongo ejemplo: 

      {
        "id": 4424,
        "fecha": "2020-01-02",
        "concepto": "ingreso efectivo",
        "debe": 20.0,
        "haber": 0.0,
        "saldo": 10001.08
      }

    Pero cuando desde c# le paso el objeto para enviar por post, al consultar el objeto con el inspector de variables me muestra la fecha en formado dd-mm-yyyy y al llamar a la funcionar del api me devuelve el mensaje:

    Content = "{\"fecha\":[\"Fecha con formato erróneo. Use uno de los siguientes formatos en su lugar: YYYY-MM-DD.\"]}"

    No se como hacer que al formatear a json me pase a ese formato de fecha, mi código por si sirve es el siguiente:

               bool resultado = true;
               
                // Datos para acceso
                string usuario = Configuracion.Default.frmConfigurarApiDatosUserLocal;
                string clave = Configuracion.Default.frmConfigurarApiDatosClaveLocal;
                string urlConfiguracion = getUrl + "/api/saldo/";
                string credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(usuario + ":" + clave));
                var client = new RestClient(urlConfiguracion);           
                var restRequest = new RestRequest(Method.POST);
                restRequest.AddParameter("cache-control", "no-cache", ParameterType.HttpHeader);
                restRequest.RequestFormat = DataFormat.Json;
                restRequest.AddBody(nuevoApunte);
                restRequest.AddHeader("Authorization", "Basic " + credentials);
                var restResponse = client.Post(restRequest);
                // SaldoJSON s = (SaldoJSON)restResponse;

                if (restResponse.StatusCode == HttpStatusCode.Created)
                {
                    return true;
                }
                else
                {
                    return false;
                }

    Es la primera vez que intento consumir un api y no se por donde cogerlo, a ver si me puedes ayudar. gracias!

    miércoles, 12 de febrero de 2020 22:50
  • hola

    >>mi código por si sirve es el siguiente:

    donde esta la fecha en ese codigo que nos muestras ?

    imagino debe estar en "nuevoApunte", pero no veo como serializas a json

    No se si analizaste el link que propuse anteriormente

    Specifying a custom DateTime format when serializing with Json.Net

    NewtonJson DateTime format serialization

    pero puede definir un convert

    se puede aplicar como parte de la settings o como atributo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 13 de febrero de 2020 0:00
  • hola!

    Gracias por la respuesta, voy a examinar lo que me has enviado, me preguntas que como genero  el json que envío, te comento que tengo una clase: 

            public class SaldoJSON
            {
                public DateTime fecha { get; set; }
                public String concepto { get; set; }
                public decimal debe { get; set; }
                public decimal haber { get; set; }
                public decimal saldo { get; set; }
            }

    nuevaEntrada es un objeto de SaldoJSON, que ya tiene los valores de cada campo.

    Estoy serializando asi:

                string json = JsonConvert.SerializeObject(nuevoApunte);
                restRequest.AddJsonBody(json);

    Ahí he pasado el json… y el formato es válido, pues el inspector de variables en VS me muestra esto:

    {"fecha":"2020-02-14T20:46:03.4354588+01:00","concepto":"2","debe":2.0,"haber":2.0,"saldo":0.0}

    pero la llamada a : 

    var restResponse = client.Post(restRequest);

    Me sigue devolviendo el mismo error:

    [0]: "Fecha con formato erróneo. Use uno de los siguientes formatos en su lugar: YYYY-MM-DD."

    La verdad, que he instalado postman por hacer test y funciona bien, puedo guardar registros, pero desde c# no se que me sucede.

    ¿alguna idea?...  Pongo el código tal cual o tengo ahora:

            public bool SaldoAnotar(SaldoJSON nuevoApunte)
            {
                bool resultado = true;
                // Datos para acceso
                string usuario = Configuracion.Default.frmConfigurarApiDatosUserLocal;
                string clave = Configuracion.Default.frmConfigurarApiDatosClaveLocal;
                string urlConfiguracion = getUrl + "/api/saldo/";
                string credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(usuario + ":" + clave));
                var client = new RestClient(urlConfiguracion);           
                var restRequest = new RestRequest(Method.POST);
                restRequest.AddParameter("cache-control", "no-cache", ParameterType.HttpHeader);
                restRequest.RequestFormat = DataFormat.Json;
                string json = JsonConvert.SerializeObject(nuevoApunte);
                restRequest.AddJsonBody(json);
                restRequest.AddHeader("Authorization", "Basic " + credentials);
                var restResponse = client.Post(restRequest);
                // SaldoJSON s = (SaldoJSON)restResponse;
                if (restResponse.StatusCode == HttpStatusCode.Created)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }

    viernes, 14 de febrero de 2020 19:50
  • hola

    >>¿alguna idea?...  Pongo el código tal cual o tengo ahora:

    pero que idea podria proponer sino intentate nada de lo que comente en respuestas anteriores

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 14 de febrero de 2020 20:07
  • Jugando un poco con Postman me he dado cuenta que he de poner exclusivamente la fecha así:  yyyy-mm-dd   Y NAD de agregar la hora..... acabo de descubrirlo, creo que por ahí anda la cosa, ahora necesito ver como le digo que el formato de4 fecha sea solo así, sin time.

    viernes, 14 de febrero de 2020 20:07
  • nuevamente, analizaste las respuestas que puse?

    en los link se explica como definir el formato de la fecha cuando serializas el json

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 14 de febrero de 2020 20:27
  • perdón , se me paso responderte, si, si revisé enlace, pero es que mi nivel de conocimientos no alcanzo a comprender exactamente que es lo que hace. De todos modos, se intuye y por la descripción que cambia el formato de la fecha en el objeto que utilizo para guardar el JSON.  He cambiado el código y ahora funciona bien.

    Mil gracias por la ayuda, llevaba varios días atascado en esto.


    viernes, 14 de febrero de 2020 21:37
  • hola

    >>¿alguna idea?...  Pongo el código tal cual o tengo ahora:

    pero que idea podria proponer sino intentate nada de lo que comente en respuestas anteriores

    ¡Hombre! ¿Cómo que no intenté nada? fue lo primero que hice, visitar los enlaces, pero mis conocimientos de programación san básico por decir algo, llevo unos 3-4 años sin programar nada en c#..

    de tus enlaces he sacado la idea básica que me ha permitido solucionarlo. Me pasaste enlace y me preguntaste como generaba el JSON, asi que te respondi a lo que me preguntabas. ¿COMO GENERAS EL JSON?...

    Mi nivel es básico y me cuesta comprender que es lo que hacía el código, no quiero un simple copia y pega (que me lo haga otro el trabajo vamos).   Quiero entender/comprender el códgio, y unido a que no era la solución definitiva pues seguía teniendo fallo en la comunicación api.   Finalmente como te he indicado me ha sido de mucha ayuda tus enlaces, pues era la solución... adaptada a las aprticularidades de mi API,   ahora bien, afirmar de forma taxativa que no he revisado la información que me enviaste considero que es pasarse un poco....si te ha dado esa impresión lo siento, el trabajo me roba mucho tiempo y talvez no he redactado con la claridad necesaria, mis disculpas y muy agradecido por tu ayuda, como siempre.Blog

    MVP Profile
    Buenos Aires
    Argentina


    sábado, 15 de febrero de 2020 16:18
  • >>Mi nivel es básico y me cuesta comprender que es lo que hacía el código

    ok pense que quedaba mas claro, volvia a repetir la pregunta porque no veia que aplicaras el formato que se define en la setting al serializar

    apuntaba a que uses algo como esto

    string json = JsonConvert.SerializeObject(nuevoApunte,
                                               new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd" });


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 15 de febrero de 2020 17:59
  • Buenos dias

    Pues en principio fue lo que hice, porque me pareció mas sencillo y claro de comprender, pero no me funcionaba y me estaba volviendo loco pues llevaba ya varios días atascado con ese problema. Finalmente delos enlaces que me pasaste consegui aplicar la solución.

    YO pensaba que el problema podría venir por el propio Windows porque monte un Linux y todo bien, pero claro, la configuración regional del Linux no estaba para España. y finalmente sin meter la hora funcionaba.   

    Luego se me ha presentado otro problema añadido, que para los informes crystall rep   me reconocia las fechas como solo texto, algo extraño, y creo que fue a raíz de la conversión del json. antes de eso iba bien.   Finalmente tome el camino fácil, pasar las fechas realmente en modo texto y con el formato deseado.  Es que apremiaba terminar el trabajo, no es lo que hubiese preferido, pero hay que terminar.

    Muchas gracias, de verdad que muy agradecido.

    lunes, 17 de febrero de 2020 10:50
  • Buenos días!...

    Finalmente en otro proyecto que estoy haciendo he realizado esta vez la conversión como me indicas, es mas sencillo, ya que la alternativa que tomé, luego a posteriori me perjudicaba para los informes de crystall Rep.   Con tu sugerencia la verdad es menos costoso y no me afecta a las librerías de informes que uso.

    Nuevamente gracias, aunque hace ya tiempo que me respondiste y te comenté que había aplicado otra solución, creo que es de reconocer que esta me parece la mejor solución y así lo he reflejado como "marcar como mejor respuesta"

    Mil gracias... un saludo

    lunes, 9 de marzo de 2020 7:28