JIL反序列化异常

时间:2016-03-15 16:49:26

标签: c# .net json deserialization jil

我在使用datetime反序列化JIL属性时遇到了一些问题。 JSON最初由JIL序列化,存储在数据库中,现在可以读回来。

反序列化器抛出了一个例外:

  

预期:,,}

这是有问题的json:

[
  {
    "BuildVersion": 0,
    "DataCenterId": "LD5",
    "Heartbeat": 1458060298923,
    "ID": "0393ceb7-92cf-45f6-8cea-ac25878598e3",
    "IsMarkedSoftDeleted": false,
    "IsNew": true,
    "ItemKey": "0393ceb7-92cf-45f6-8cea-ac25878598e3",
    "ItemType": "Node",
    "MajorVersion": 0,
    "MaxAccounts": 25,
    "MinorVersion": 0,
    "Name": "LN-PETER2",
    "OriginalId": null,
    "RunningAccounts": 0,
    "TypeId": "MT4 Client"
  }
]

HeartbeatDateTime属性,我们已确认通过删除它,JSON反序列化确定。

我们将这些选项用于序列化和反序列化:

new Options(dateFormat: DateTimeFormat.MillisecondsSinceUnixEpoch, includeInherited: true);

我注意到Sigil本周有一些nuget更新,不确定它是否与此有关。

有什么想法吗?

更新: 类定义很长,但心跳属性的定义是决定反序列化的定义如下:

public DateTime Heartbeat { get; set; }

这是使用静态反序列化。

1 个答案:

答案 0 :(得分:0)

涉及JSON.NET的一种可能解决方案是使用custom JsonConverter,允许将Unix timestamp明确转换为DateTime

class VersionInfo
{
    public int BuildVersion { get; set; }
    public String DataCenterId { get; set; }

    [JsonConverter(typeof(MicrosecondEpochConverter))]
    public DateTime Heartbeat { get; set; }
    public Guid ID { get; set; }
}

static void Main(string[] args)
{
    String json = @"
        [
            {
                ""BuildVersion"": 0,
                ""DataCenterId"": ""LD5"",
                ""Heartbeat"": 1458060298923,
                ""ID"": ""0393ceb7-92cf-45f6-8cea-ac25878598e3""
            }
        ]";

    var versionInfo = JsonConvert.DeserializeObject<IList<VersionInfo>>(json);

}

versionInfo对象将包含已转换的DateTime - {3/15/2016 4:44:58 PM}