2011-02-11 27 views
9

Tengo un servicio WCF que devuelve un objeto CLR. Este objeto se define de la siguiente manera:Analizando una información de fecha JSON en un C# DateTime

[DataContract] 
public class Person 
{ 
    [DataMember] 
    public string FullName 
    { 
    get { return fullName; } 
    set { id = fullName; } 
    } 
    private string fullName = string.Empty; 

    [DataMember] 
    public DateTime BirthDate 
    { 
    get { return birthDate; } 
    set { birthDate = value; } 
    } 
} 

Instancias de este objeto se crean y devuelven desde mi servicio WCF. Este servicio tiene el siguiente aspecto:

[OperationContract] 
[WebGet(UriTemplate = "/GetPersonByID/{id}", ResponseFormat = WebMessageFormat.Json)] 
public Person GetPersonByID(string id) 
{ 
    Person person = FindPersonByID(id); 
    return person; 
} 

Cuando llego a la respuesta de vuelta en mi solicitud, puedo extraer con éxito el valor NombreCompleto. Sin embargo, no he podido convertir BirthDate a un objeto C# DateTime con éxito en mi aplicación cliente. Cuando se convierte en una cadena, el BirthDate ve algo como esto:

\/Date(1297367252340-0500)\/ 

¿Cómo consigo que en una instancia de C# DateTime?

Gracias!

+1

No existe la fecha JSON. – JeremyP

Respuesta

5

Aquí hay dos opciones:

Puede utilizar el método de Deserialize System.Web.Script.Serialization.JavaScriptSerializer (en System.Web.Extensions.dll).

o puede utilizar el método ReadObject desde System.Runtime.Serialization.Json.DataContractJsonSerializer (en System.Runtime.Serialization.dll o en .NET 3.5 en System.ServiceModel.Web.dll).

Asegúrese de que su fecha se envuelve en citas como:

string dateString = @"""\/Date(1297367252340-0500)\/"""; 
+0

El problema es que mi cliente es una aplicación de Silverlight. Silverlight no tiene el método Deserialize. – user70192

+0

¿Está en su mesa para probar el DataContractJsonSerializer? Los documentos afirman que está disponible en Silverlight 3 y 4. –

4

La razón es la fecha en este formato extraño es que DateTime es una primitiva de WCF. Desafortunadamente, no existe un formato universalmente estandarizado para serializar fechas y horas en JSON: varios marcos usan varios formatos de cadena.

El dilema es que WCF necesita entender de forma nativa que una cadena en particular a través del cable es de hecho un DateTime, no simplemente otra cadena JSON simple y plana. De ahí el extraño formato. Tan pronto como DataContractJsonSerializer encuentra una fecha que comienza con \/Date, comienza a tratar de analizarlo como una fecha.

Ahora, para responder a su pregunta, cuando está enviando un DateTime a través del cable, depende de si está utilizando un cliente de navegador web, un cliente de Silverlight o un cliente de WCF.

Un cliente WCF o un cliente Silverlight 2+ NO debería tener problemas con esto: deberían usar automáticamente DataContractJsoNSerializer, y si no lo están utilizando, puede conectar DCJS manualmente.

Si está utilizando un cliente web, puede incluir el archivo .js que se envía con ASP. NET AJAX (creo que se llama MicrosoftAspNetAjax.js o MicrosoftAjax.cs, aunque el nombre puede haber cambiado). Su función deserializar también analizará automáticamente estas fechas.

Espero que ayude!

+0

Una respuesta mucho más útil e informativa que simplemente decir que no existe una fecha JSON. – jk7

1

Esta solucionado mi problema

using System.Web.Script.Serialization; 


//code 
JavaScriptSerializer json_serializer = new JavaScriptSerializer(); 
DateTime ddate = json_serializer.Deserialize<DateTime>(@"""\/Date(1326038400000)\/""").ToLocalTime(); 
3

Bueno, últimamente he tenido que trabajar en un proyecto de aplicación para Android móvil (Xamarin Studio), donde he podido utilizar Newtonsoft JSON (Json.NET) debido a errores generados durante las implementación en esta versión específica del dispositivo (Android API 16 versión 4.2.1).

Luckly Encontré una biblioteca alternativa para json (System.Json). Sin embargo, esta biblioteca no tiene una forma de convertir la fecha JSON a C# DateTime implícitamente.

he creado las siguientes dos funciones para las conversiones de fecha y fecha anulables partir de una fecha cadena JSON (es decir/Fecha (1389435240000 + 0000) /)

El código se puede mejorar, pero hace el trabajo por ahora

public static DateTime? ConvertToNallableDate(string date) 
     { 

      DateTime? val = null; 
      /*   /Date(1389435240000+0000)/*/ 
      try{ 
       if(!string.IsNullOrEmpty(date)) 
       { 
        date = date.Replace ("/Date(", string.Empty).Replace (")/", string.Empty); 
        int pIndex = date.IndexOf ("+"); 
        if(pIndex < 0) pIndex = date.IndexOf("-"); 
        long millisec = 0; 
        date = date.Remove (pIndex); 
        long.TryParse (date, out millisec); 
        System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-GB"); 
        DateTime newDate = DateTime.Parse ("1970,1,1", ci); 
        newDate = newDate.AddMilliseconds(millisec); 
        val = newDate == null ? (DateTime?)null : newDate; 

       } 
      }catch { 
       val = null; 
      } 
      return val; 
     } 

     public static DateTime ConvertToDate(string date) 
     { 

      DateTime val = new DateTime(); 
      /*/Date(1389435240000+0000)/*/ 
      try{ 
      if(!string.IsNullOrEmpty(date)) 
      { 
       date = date.Replace ("/Date(", string.Empty).Replace (")/", string.Empty); 
       int pIndex = date.IndexOf ("+"); 
       if(pIndex < 0) pIndex = date.IndexOf("-"); 
       long millisec = 0; 
       date = date.Remove (pIndex); 
       long.TryParse (date, out millisec); 
       System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-GB"); 
       DateTime newDate = DateTime.Parse ("1970,1,1", ci); 
       val = newDate.AddMilliseconds(millisec); 

      } 
      }catch { 
       val = new DateTime(); 
      } 
      return val; 
     } 
+0

Se rompe si no hay un sufijo de zona horaria en la fecha json –