2013-08-06 41 views
7

Tôi đang làm việc với một phản ứng như sau:Làm thế nào để deserialize ngày (mili giây) với 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"} 

Tôi đang cố gắng để deserialize này vào một lớp học mà trông giống như:

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

Các cuộc gọi đến deserialize là khá đơn giản:

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

Điều này dẫn đến một ngoại lệ:

Could not convert string to DateTime: 1278448832702.

Có cách nào tôi có thể nhận JSON.NET để deserialize ngày này chính xác không?

Trả lời

19

Bạn có thể tạo một bộ chuyển đổi tùy chỉnh 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

Đừng quên ghi đè 'CanWrite()' để trả về false. –

+1

@BrianRogers Nó sẽ không gây hại gì cả trong quá trình deserialization .. – I4V

+2

Để chính xác, bạn nên sử dụng hàm tạo 'DateTime' cho phép bạn chuyển' DateTimeKind.Utc'. –

2

Tôi không nghĩ rằng đó là mili giây trên mỗi giây, nhưng thay vào đó là thời gian của thời đại Unix, c.f. this bài viết tôi tìm thấy trên developerforce.com

Tôi tin rằng this có thể giúp - mô tả viết JsonConverter tùy chỉnh mà bạn có thể sử dụng với JSON.net để chuyển đổi thời gian này thành DateTime.

+1

Tôi nghĩ rằng các tài liệu có thể sai. '1278448832702' giây [hoạt động trong hơn 40.000 năm] (https://www.google.com/#bav=on.2,or.r_qf.&fp=9de714aba85e5449&q=1278448832702+seconds+%3D+%3F+years). Và trên thực tế, nếu bạn cố gắng làm 'DateTime mới (1970,0,0) .AddSeconds (1278448832702)' bạn sẽ nhận được 'ArgumentOutOfRangeException'. Nhiều khả năng nó * là * mili giây. –

Các vấn đề liên quan