2011-02-11 5 views
9

Ho un servizio WCF che restituisce un oggetto CLR. Questo oggetto è definito come segue:Analisi di informazioni di una data JSON in 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; } 
    } 
} 

istanze di questo oggetto sono stati creati e restituiti dal mio servizio WCF. Questo servizio è simile al seguente:

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

Quando ottengo la risposta indietro nella mia domanda, posso estrarre con successo il valore FullName. Tuttavia, non sono riuscito a convertire il BirthDate in un oggetto DateTime C# nella mia applicazione client. Quando convertito in una stringa, la data di nascita simile a questa:

\/Date(1297367252340-0500)\/ 

Come posso ottenere che in un'istanza di C# DateTime?

Grazie!

+1

Non esiste una data JSON. – JeremyP

risposta

5

Qui ci sono due opzioni:

È possibile utilizzare il metodo Deserialize da System.Web.Script.Serialization.JavaScriptSerializer (in System.Web.Extensions.dll).

oppure è possibile utilizzare il metodo ReadObject da System.Runtime.Serialization.Json.DataContractJsonSerializer (in System.Runtime.Serialization.dll o in .NET 3.5 in System.ServiceModel.Web.dll).

Assicurarsi che la data è avvolto tra virgolette come:

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

Il problema è che il mio client è un'applicazione Silverlight. Silverlight non ha il metodo Deserialize. – user70192

+0

Sei tavolo per provare DataContractJsonSerializer? I documenti affermano che è disponibile in Silverlight 3 e 4. –

4

La ragione la data è in questo formato strana è che DateTime è un primitivo in WCF. Sfortunatamente, non esiste un formato universalmente standardizzato per la serializzazione di date e orari in JSON - vari framework utilizzano vari formati di stringhe.

Il dilemma è che WCF ha bisogno di capire in modo nativo che una particolare stringa sul filo è effettivamente un DateTime, non solo un'altra semplice stringa JSON vaniglia. Da qui lo strano formato. Non appena DataContractJsonSerializer rileva una data che inizia con \/Date, inizia a provare ad analizzarla come una data.

Ora, per rispondere alla domanda, quando si invia un DateTime tramite cavo, dipende dal fatto che si stia utilizzando un client browser Web, un client Silverlight o un client WCF.

Un client WCF o un client Silverlight 2+ NON dovrebbe avere problemi con questo: devono utilizzare automaticamente DataContractJsoNSerializer e, se non lo utilizzano, è possibile collegare DCJS manualmente.

Se si utilizza un client Web, è possibile includere il file .js fornito con ASP. NET AJAX (credo sia chiamato MicrosoftAspNetAjax.js o MicrosoftAjax.cs, sebbene il nome possa essere cambiato). La sua funzione di deserializzazione analizzerà automaticamente anche queste date.

Spero che questo aiuti!

+0

Una risposta molto più utile e informativa che semplicemente dicendo che non esiste una data JSON. – jk7

1

Questo risolto il mio problema

using System.Web.Script.Serialization; 


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

Beh, ultimamente ho dovuto lavorare su un progetto Android mobile (Xamarin Studio) dove sono stato in grado di utilizzare Newtonsoft JSON (Json.NET) a causa di errori generati durante implementazione su questa specifica versione del dispositivo (Android API 16 Versione 4.2.1).

Fortunatamente ho trovato una libreria alternativa per json (System.JSON). Tuttavia questa libreria non ha un modo di trasmettere la data JSON a C# DateTime implicitamente.

ho creato le seguenti due funzioni per la data e la data nullable conversioni da una data stringa JSON (cioè/Data (1.389.435,24 milioni + 0000) /)

Il codice può essere migliorata, ma fa il lavoro per ora

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

Interrompe se non è presente il suffisso del fuso orario nella data JSON –