2009-03-21 7 views
33

ich ein Objekt serialisiert haben Newtonsoft JSON Serializer verwenden und die Datetime hat sich durch so kommen:Parsing JSON Datetime von Newtonsoft JSON Serializer

/Date(1237588418563+0000)/ 

Wenn ich $ .evalJSON() auf, dass, ist es ein Ziel aber ich kann keine normalen Date-Methoden wie toUTCSTing darauf finden.

Irgendwelche Ideen, was ich damit machen kann?

+0

macht diese Arbeit für Sie ?: http://www.tek-tips.com/viewthread.cfm?qid=1526126&page=8 – bernie

Antwort

77

Verwenden Sie einen der JsonConverter, die mit Json.NET geliefert werden, um mit Daten zu arbeiten, um ein besseres Format zu erhalten. JavaScriptDateTimeConverter gibt Ihnen automatisch ein JavaScript-Datum.

public class LogEntry  
{  
    public string Details { get; set; }  
    public DateTime LogDate { get; set; } 
} 

[Test] 
public void WriteJsonDates() 
{  
    LogEntry entry = new LogEntry  
    {  
    LogDate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Utc),  
    Details = "Application started."  
    };  


    string defaultJson = JsonConvert.SerializeObject(entry);  
    // {"Details":"Application started.","LogDate":"\/Date(1234656000000)\/"}  

    string javascriptJson = JsonConvert.SerializeObject(entry, new JavaScriptDateTimeConverter());  
    // {"Details":"Application started.","LogDate":new Date(1234656000000)} 

    string isoJson = JsonConvert.SerializeObject(entry, new IsoDateTimeConverter());  
    // {"Details":"Application started.","LogDate":"2009-02-15T00:00:00Z"}  
} 

Dokumentation: Serializing Dates in JSON with Json.NET

+4

Als Referenz der Namespace auf IsoDateTimeConverter ist Newtonsoft. Json.Converters und auf JsonConvert.SerializeObject ist es Newtonsoft.Json –

2

lief in das gleiche Problem und fand eine Lösung basierend auf dem Link von Adam:

new Date(yourDate.substr(yourDate.indexOf("(") + 1, 13) - 0)); 

Es ist wie ein Unix-Zeitstempel sieht, die Javascript leicht in der Lage ist in ein Datumsobjekt umwandeln. Die - 0 ist einfach zu Javascript, um die substr Ausgabe als Integer zu machen zu behandeln ... Ich denke, man es auch Number() könnte, wenn man die Blicke nicht von - 0 wie

1

Das JSON-Objekt so etwas wie dies enthalten:

var data = {"CreatedDate":"/Date(1327572000000-1000)/"}); 

/// 
var oddDateTimeZone = data.CreatedDate; 
var utcDateTime = oddDateTimeZone.substr(oddDateTimeZone.indexOf("(")+1, 13); 
var utcZone = oddDateTimeZone.substr(oddDateTimeZone.indexOf("-")+1, 4); 
var utcDateTimeZone = new Date(Number(utcDateTime)-(Number(utcZone))); 

aber immer noch wäre es besser, das JSON-Objekt zu reparieren, damit die Datumsfunktion ausgelöst wird, ohne etwas wie eval() oder window [] zu verwenden. Vielleicht in jQuery. Nicht sicher.

Vergessen Sie nicht, dass der Offset + und nicht nur - für den Offset sein könnte!

+0

Sie verwenden auch eine Regex und dann den Text wie folgt auswerten: 'eval (" neu "+ data.CreateDate.replace (/ \ // ig," ")) ' scheint gut zu funktionieren –

15

Ab Newtonsoft Json.Net Version 4.5r5 verwenden Sie die JsonPropertyAttribute Class-Klasse und legen Sie die Eigenschaft ItemConverterType Property fest. Verbrauch:

// class to be serialized 
public class MyClass 
{ 
    [JsonProperty(ItemConverterType = typeof(JavaScriptDateTimeConverter))] 
    public DateTime? DateTime1; 
    public DateTime? DateTime2; 
} 

Wie ich beobachtet habe dies die Datetimeconverter für alle Objekte in dieser Klasse festgelegt werden nicht nur die, die vor dem erklärt wird.

+0

Diese Antwort ist die aktuellste –

+1

Ich glaube nicht, dass ich verstehe, was dies tun soll, oder wie es funktionieren soll. In meiner Klasse habe ich folgendes: [JsonProperty (ItemConverterType = typeof (IsoDateTimeConverter))] public System.DateTime RecordInsertedDate {get; einstellen; } Aber meine Daten kommen immer noch als Standard/Datum (132456560000000)/Format –

+0

NVM, ich war mit ServiceStack, die dies überging. Sie müssen ServiceStacks JsConfig.DateHandler = DateHandler.ISO8601; config Einstellung in Ihrem Code zu erhalten ISO8601 –

14

Ich kam zu einem anderen Ansatz, der für einige nützlich sein könnte. Im Grunde erstelle ich meinen eigenen CustomDateConverter, den ich rufe, wenn ich es brauche. Der Umsetzer benötigt 2 Parameter, ein Datumsformat, z. yyyy-MM-dd HH:mm:ss und ein Timezone, die mir das Datum aus UTC des Benutzers Zeitzone zu konvertieren:

public class JSONCustomDateConverter : DateTimeConverterBase 
{ 
    private TimeZoneInfo _timeZoneInfo; 
    private string _dateFormat; 

    public JSONCustomDateConverter(string dateFormat, TimeZoneInfo timeZoneInfo) 
    { 
     _dateFormat = dateFormat; 
     _timeZoneInfo = timeZoneInfo; 
    } 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(DateTime); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     writer.WriteValue(TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime(value), _timeZoneInfo).ToString(_dateFormat)); 
     writer.Flush(); 
    } 

Sie können es wie folgt verwenden:

var jsonString = JsonConvert.SerializeObject(myObject, Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, Converters = new List<JsonConverter>() { new JSONCustomDateConverter("yyyy-MM-dd HH:mm:ss", loggedUser.Timezone) } }); 

Offensichtlich könnten Sie auf die Zeitzone entfernen bezogen alles wenn Sie nur eine benutzerdefinierte Datumsformatierung wünschen. Lass mich wissen, dass es geholfen hat!

+2

Endlich gefunden eine normale Überschreibung Probe :) Vielen Dank – povilasp

+0

Wenn jemand sucht, um es durch globale Registrierung auf Asp.Net MVC.services.AddMvc() zu erweitern .AddJsonOptions (jsonOption => { jsonOption.SerializerSettings.Converters.Add ( neuer JSONCustomDateConverter ("dd/mm/yyy", TimeZoneInfo.FindSystemTimeZoneById ("Indien Standard Time"))); }); ' –

0

Leider vereinfachen ich ein bisschen @James Newton-King

string date = Newtonsoft.Json.JsonConvert.SerializeObject(DateTime.Now);  
0

ObjectMapper Mapper = new ObjectMapper();

mapper.registerModule (neues JavaTimeModule());

mapper.configure (SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

Dies funktioniert für mich