如何使用 Newtonsoft 反序列化 EPOCH

Posted

技术标签:

【中文标题】如何使用 Newtonsoft 反序列化 EPOCH【英文标题】:How to deserialize EPOCH using Newtonsoft 【发布时间】:2021-12-18 02:40:25 【问题描述】:

我需要使用 Newtonsoft.Json 反序列化 JSON,我的 JSON 中的一个值具有 EPOCH 格式:

  *"fechaGrabacionODH": 
    "$date": 1634689986082
  ,*

我正在使用它来反序列化,但它不起作用

*var settings = new JsonSerializerSettings

    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
;*

*Data = JsonConvert.DeserializeObject<Constructores_IdPnODH.Data>(payload_Decryp, settings);**

我收到此错误:

解析值时遇到意外字符:。路径 'fechaGrabacionODH',第 1 行,位置 261。

我非常感谢任何帮助。 提前致谢。

【问题讨论】:

【参考方案1】:

您可以使用自定义JsonConverter

public class EpochConverter : JsonConverter

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    
        var jObject = new JObject();
        jObject["$date"] = new DateTimeOffset((DateTime)value).ToUnixTimeMilliseconds();
        jObject.WriteTo(writer);
    

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    
        var jObject = JObject.Load(reader);
        var epoch = jObject.GetValue("$date").Value<long>();
        return DateTimeOffset.FromUnixTimeMilliseconds(epoch).UtcDateTime;
    

    public override bool CanRead => true;

    public override bool CanConvert(Type objectType) => objectType == typeof(DateTime);

然后用一个属性应用它

class YourObject
    [JsonConverter(typeof(EpochConverter))]
    public DateTime fechaGrabacionODH;

dotnetfiddle

【讨论】:

以上是关于如何使用 Newtonsoft 反序列化 EPOCH的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Newtonsoft.Json 正确反序列化数组中的嵌套对象? [复制]

如何通过NewtonSoft反序列化对象json列表?

如何使用 newtonsoft json 解决有关无法反序列化当前(例如 “name”:“value”)的难题 [关闭]

如何使用 NewtonSoft Json.Net 将 Json 字典反序列化为平面类

如何让newtonsoft将yes和no反序列化为布尔值

使用Newtonsoft.Json.dll序列化和反序列化