2013-08-06 22 views
7

ich mit einer Antwort wie die folgenden Arbeiten:Wie das Datum (Millisekunden) mit JSON.NET deserialisieren?

{"id":"https://login.salesforce.com/id/00Dx0000000BV7z/005x00000012Q9P", 
"issued_at":"1278448832702","instance_url":"https://na1.salesforce.com", 
"signature":"0CmxinZir53Yex7nE0TD+zMpvIWYGb/bdJh6XfOH6EQ=","access_token": 
"00Dx0000000BV7z!AR8AQAxo9UfVkh8AlV0Gomt9Czx9LjHnSSpwBMmbRcgKFmxOtvxjTrKW1 
9ye6PE3Ds1eQz3z8jr3W7_VbWmEu4Q8TVGSTHxs"} 

Ich versuche, diese in eine Klasse deserialisieren, die wie folgt aussieht:

public class TokenResponse { 
    public string Id { get; set; } 
    [JsonProperty(PropertyName = "issued_at")] 
    public DateTime IssuedAt { get; set; } 
    public string Signature { get; set; } 
    [JsonProperty(PropertyName = "instance_url")] 
    public string InstanceUrl { get; set; } 
    [JsonProperty(PropertyName = "access_token")] 
    public string AccessToken { get; set; } 
} 

Der Aufruf zu deserialisieren ist ziemlich einfach:

JsonConvert.DeserializeObject<TokenResponse>(response.Content); 

Dies zu einer Ausnahme:

Could not convert string to DateTime: 1278448832702.

Gibt es eine Möglichkeit, JSON.NET dieses Datum korrekt deserialisieren zu lassen?

Antwort

19

Sie können eine benutzerdefinierte Datetime-Konverter

var token = JsonConvert.DeserializeObject<TokenResponse>(response.Content, 
                 new MyDateTimeConverter()); 

public class MyDateTimeConverter : Newtonsoft.Json.JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(DateTime); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var t = long.Parse((string)reader.Value); 
     return new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(t); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

Vergessen Sie nicht, 'CanWrite()' zu überschreiben, um false zurückzugeben. –

+1

@BrianRogers Es würde keinen Schaden während der Deserialisierung .. – I4V

+2

Um genau zu sein, sollten Sie den Konstruktor von 'DateTime' verwenden, mit dem Sie' DateTimeKind.Utc' übergeben können. –

2

Ich glaube nicht, dass das Millisekunden per se ist, sondern stattdessen die Unix-Epoche, c.f. this Artikel Ich fand auf developerforce.com

Ich glaube, dass this könnte helfen - es beschreibt das Schreiben eines benutzerdefinierten JsonConverter, die Sie mit JSON.net verwenden können, um diese Epochen in eine DateTime zu konvertieren.

+1

Ich denke, erstellen die Dokumentation falsch sein kann. '1278448832702' Sekunden [funktioniert in mehr als 40.000 Jahren] (https://www.google.com/#bav=on.2,or.r_qf.&fp=9de714aba85e5449&q=1278448832702+seconds+%3D+%3F+years). Und in der Tat, wenn Sie versuchen, 'new DateTime (1970,0,0) .AddSeconds (1278448832702)' zu tun, erhalten Sie eine'ArgumentOutOfRangeException'. Wahrscheinlicher ist es * Millisekunden. –

Verwandte Themen