【问题标题】:How to deserialize date (milliseconds) with JSON.NET?如何使用 JSON.NET 反序列化日期(毫秒)?
【发布时间】:2013-08-06 19:02:34
【问题描述】:

我正在处理如下响应:

{"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 正确反序列化这个日期?

【问题讨论】:

    标签: c# .net json.net


    【解决方案1】:

    您可以创建自定义日期时间转换器

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

    【讨论】:

    【解决方案2】:

    我认为这本身不是毫秒,而是 Unix 纪元时间,c.f. this我在 developerforce.com 上找到的文章

    我相信this 可以提供帮助 - 它描述了编写一个自定义 JsonConverter,您可以使用它与 JSON.net 一起将这些纪元时间转换为 DateTime。

    【讨论】:

    • 我认为文档可能有误。 1278448832702works out to more than 40,000 years。事实上,如果你尝试做new DateTime(1970,0,0).AddSeconds(1278448832702),你会得到一个ArgumentOutOfRangeException。更有可能是 毫秒。
    猜你喜欢
    • 2015-09-25
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    相关资源
    最近更新 更多