如何使用JSON.NET反序列化日期(毫秒)

本文关键字:毫秒 日期 反序列化 何使用 JSON NET | 更新日期: 2023-09-27 18:26:36

我正在处理如下响应:

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

如何使用JSON.NET反序列化日期(毫秒)

您可以创建自定义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();
    }
}

我不认为这本身是毫秒,而是Unix epoch时间,参见我在developerforce.com 上找到的这篇文章

我相信这会有所帮助——它描述了编写一个自定义的JsonConverter,您可以使用它与JSON.net一起将这些epoch时间转换为DateTime。