2013-08-06 37 views
7

我與類似下面的響應工作:如何使用JSON.NET反序列化日期(毫秒)?

{"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"} 

我試圖反序列化到一個類,看起來像這樣:

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; } 
} 

調用反序列化是非常簡單的:

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

這將導致一個例外:

Could not convert string to DateTime: 1278448832702.

有沒有一種方法,我可以得到JSON.NET正確地反序列化這個日期?

回答

19

您可以創建一個自定義DateTime轉換器

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

不要忘記重寫'CanWrite()'返回false。 –

+1

@BrianRogers它不會做任何傷害,而反序列化.. – I4V

+2

是準確的,你應該使用DateTime'的'構造,使您可以通過'DateTimeKind.Utc'。 –

2

我不認爲這是毫秒本身,而是Unix紀元時間,C.F.它描述了編寫定製JsonConverter您可以與JSON.net使用這些大紀元轉換爲datetime - this文章中,我就developerforce.com

我相信this可以幫助找到。

+1

我認爲,文件可能是錯誤的。 '1278448832702'秒[工程以4萬多年](https://www.google.com/#bav=on.2,or.r_qf.&fp=9de714aba85e5449&q=1278448832702+seconds+%3D+%3F+years)。而事實上,如果你嘗試做'新的DateTime(1970,0,0).AddSeconds(1278448832702)'你會得到一個'ArgumentOutOfRangeException'。更可能*是*毫秒。 –