gestión json datetime response in asp.net mold

En primer lugar, lamento mi confuso inglés, trataré de explicarme lo mejor que pueda. Estoy programando un sitio web que permite verificar las certificaciones de identidad mediante un código de verificación, para que el usuario pueda comprar uno de estos documentos en línea, y el código permite a cualquier persona o entidad gubernamental verificar la veracidad del documento. para este propósito, programé un servicio wcf que funciona perfectamente, y un sitio asp .net que recibe el código, lo envía al servicio y devuelve los datos, si existe. si no existe, el sitio web lo dice, causa tiene manejo de errores y control de datos null mi problema es con el manejo de la fecha de emisión, porque en la base de datos ( gestionada en mysql), la fecha está bien guardada, pero cuando se recibe en el sitio web, devuelve lo siguiente

01/01/0001 00:00 000

He intentado convertir la columna en la base de datos de formato datetime a string, haciendo la conversión en el servicio wcf, incluso convirtiendo los datos de fecha en el formulario web, o definiendo esta propiedad en las clases en datetime o string. por el momento, este es mi código y funciona, pero no puedo mostrar la fecha en forma correcta.

esta es la respuesta de JSON. tal vez aquí está el problema, pero no puedo verlo

{"ID":39000,"DNI":123456789,"Code":"D025000","Name":"JOSE","Date":"\/Date(1608076800000+0000)\/"}

Este es el defecto. aspx.cs form

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;
using System.IO;
using Newtonsoft.Json;

//  
public class Root
{
    public int id { get; set; }
    public int dni { get; set; }
    public string certcode { get; set; }
    public string name { get; set; }
    public DateTime issuedate { get; set; }
}

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void cmd_check_Click(object sender, EventArgs e)
    {
        try
        {
            Label1.Visible = true;
            Label2.Visible = true;
            Label3.Visible = true;
            Label4.Visible = true;
            Label5.Visible = true;
            Label6.Visible = true;
            Label7.Visible = true;
            Label8.Visible = true;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"https://mywebsite.net/Service.svc/CheckCert/"+txt_code.Text+"");
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            using (Stream stream = response.GetResponseStream())
            using (StreamReader reader = new StreamReader(stream))
            {
                string json = reader.ReadToEnd();
                Root myDeserializedClass = JsonConvert.DeserializeObject(json);
                if (myDeserializedClass.certcode==null){
                    Label1.Visible = true;
                    Label1.Text = "document not found";
                    Label2.Visible = false;
                    Label3.Visible = false;
                    Label4.Visible = false;
                    Label5.Visible = false;
                    Label6.Visible = false;
                    Label7.Visible = false;
                    Label8.Visible = false;
                    Label9.Visible = false;
                    Label10.Visible = false;


                }
                else { 
                Label1.Visible = true;
                    Label1.Text = "name";
                    Label2.Visible = true;
                Label3.Visible = true;
                Label4.Visible = true;
                Label5.Visible = true;
                Label6.Visible = true;
                Label7.Visible = true;
                Label8.Visible = true;
                    Label9.Visible = true;
                Label10.Visible = true;
                Label2.Text = myDeserializedClass.name;
                Label4.Text = myDeserializedClass.dni.ToString();
                Label6.Text = myDeserializedClass.id.ToString();
                Label8.Text = myDeserializedClass.certcode;
                    Label10.Text = myDeserializedClass.issuedate.ToString();
                        ;
                }

            }


        }

        catch {
            Label1.Visible = true;
            Label1.Text = "document not found";
            Label2.Visible = false;
            Label3.Visible = false;
            Label4.Visible = false;
            Label5.Visible = false;
            Label6.Visible = false;
            Label7.Visible = false;
            Label8.Visible = false;
        }

    }

este es el resultado real cuando busco los datos en el sitio web, como un cliente real. el sitio web es en español porque los usuarios están en Costa Rica

ejemplo imagen

¿Puedes ayudarme? Muchas gracias.

Pregunta hecha hace 3 años, 4 meses, 26 días - Por rubyrover


3 Respuestas:

  • ¿Puede usted intentar añadir el siguiente código

    JsonSerializerSettings microsoftDateFormatSettings = new JsonSerializerSettings
    {
        DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
    };
     Root myDeserializedClass = JsonConvert.DeserializeObject(json,microsoftDateFormatSettings);
    

    después de ese cheque cuál es el valor de su emitido

    Hice un ejemplo de trabajo que puedes comprobar en el siguiente enlace https://dotnetfiddle.net/EC8cwH

    Respondida el Dec 19, 2020 a las 19:37 - por compilerczar

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando con la fecha de emisión en tu respuesta JSON es común cuando trabajas con fechas en formato datetime en ASP.NET. Parece que estás recibiendo la fecha en un formato de ticks en tu objeto JSON y necesitas convertirlo a un formato legible antes de mostrarlo en tu página web.

    Para solucionar este problema, puedes realizar la conversión de ticks a un formato de fecha legible en tu clase Root. Puedes agregar una propiedad adicional que represente la fecha en un formato amigable para el usuario.

    Aquí te dejo un ejemplo de cómo podrías modificar tu clase Root para incluir una propiedad adicional llamada IssueDateFormatted que contendrá la fecha de emisión en un formato legible:

    csharp
    public class Root
    {
        public int ID { get; set; }
        public int DNI { get; set; }
        public string CertCode { get; set; }
        public string Name { get; set; }
        public DateTime IssueDate { get; set; }
        public string IssueDateFormatted => IssueDate.ToString("dd/MM/yyyy"); // Formato deseado para la fecha
    }
    

    Luego, en tu código en el evento cmd_check_Click, puedes utilizar la propiedad IssueDateFormatted para mostrar la fecha correctamente en tu página web. Por ejemplo:

    csharp
    Label10.Text = myDeserializedClass.IssueDateFormatted;
    

    Con esto, el valor de la fecha de emisión se mostrará en el formato deseado en lugar de los ticks de UNIX que estás recibiendo actualmente.

    Espero que esta solución te sea de ayuda. ¡Déjame saber si tienes alguna otra pregunta o necesitas más asistencia!

    Respondida el Dec 20, 2020 a las 19:35 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema con la fecha

    El problema con el formato de fecha se debe a la forma en que se está serializando la fecha en JSON. La fecha se está serializando como una cadena en formato "/Date(ticks)/", donde "ticks" representa el número de milisegundos desde la época de Unix (1 de enero de 1970).

    Solución

    Para resolver este problema, debes convertir la cadena de fecha recibida en JSON en un objeto DateTime utilizando el constructor DateTime(long ticks):

    csharp
    DateTime issuedate = new DateTime(long.Parse(myDeserializedClass.issuedate.Substring(6, 13)));
    

    También puedes utilizar el método DateTime.FromBinary para convertir la cadena:

    csharp
    DateTime issuedate = DateTime.FromBinary(long.Parse(myDeserializedClass.issuedate.Substring(6, 13)));
    

    Una vez que hayas convertido la cadena en un objeto DateTime, puedes formatearla en el formato deseado:

    csharp
    Label10.Text = issuedate.ToString("dd/MM/yyyy"); // Formato de fecha dd/MM/aaaa
    

    Código actualizado

    Aquí tienes el código actualizado con las correcciones:

    csharp
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Net;
    using System.IO;
    using Newtonsoft.Json;
    
    //  
    public class Root
    {
        public int id { get; set; }
        public int dni { get; set; }
        public string certcode { get; set; }
        public string name { get; set; }
        public string issuedate { get; set; }
    }
    
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
    
        protected void cmd_check_Click(object sender, EventArgs e)
        {
            try
            {
                Label1.Visible = true;
                Label2.Visible = true;
                Label3.Visible = true;
                Label4.Visible = true;
                Label5.Visible = true;
                Label6.Visible = true;
                Label7.Visible = true;
                Label8.Visible = true;
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"https://mywebsite.net/Service.svc/CheckCert/"+txt_code.Text+"");
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                using (Stream stream = response.GetResponseStream())
                using (StreamReader reader = new StreamReader(stream))
                {
                    string json = reader.ReadToEnd();
                    Root myDeserializedClass = JsonConvert.DeserializeObject(json);
                    if (myDeserializedClass.certcode==null){
                        Label1.Visible = true;
                        Label1.Text = "document not found";
                        Label2.Visible = false;
                        Label3.Visible = false;
                        Label4.Visible = false;
                        Label5.Visible = false;
                        Label6.Visible = false;
                        Label7.Visible = false;
                        Label8.Visible = false;
                        Label9.Visible = false;
                        Label10.Visible = false;
    
    
                    }
                    else { 
                    Label1.Visible = true;
                        Label1.Text = "name";
                        Label2.Visible = true;
                    Label3.Visible = true;
                    Label4.Visible = true;
                    Label5.Visible = true;
                    Label6.Visible = true;
                    Label7.Visible = true;
                    Label8.Visible = true;
                        Label9.Visible = true;
                    Label10.Visible = true;
                    Label2.Text = myDeserializedClass.name;
                    Label4.Text = myDeserializedClass.dni.ToString();
                    Label6.Text = myDeserializedClass.id.ToString();
                    Label8.Text = myDeserializedClass.certcode;
                    DateTime issuedate = new DateTime(long.Parse(myDeserializedClass.issuedate.Substring(6, 13)));
                    Label10.Text = issuedate.ToString("dd/MM/yyyy");
                    }
    
                }
    
    
            }
    
            catch {
                Label1.Visible = true;
                Label1.Text = "document not found";
                Label2.Visible = false;
                Label3.Visible = false;
                Label4.Visible = false;
                Label5.Visible = false;
                Label6.Visible = false;
                Label7.Visible = false;
                Label8.Visible = false;
            }
    
        }
    
    

    Nota:

    También deberías manejar el caso en el que la fecha de emisión sea null en la base de datos. En ese caso, puedes asignar un valor predeterminado a issuedate o mostrar un mensaje indicando que la fecha de emisión no está disponible.

    Respondida el Dec 20, 2020 a las 19:45 - por Gemini

    Votos positivos: 0 | Votos negativos: 0