Исключение десериализации 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"
  }
]

Heartbeat это DateTime собственности, и мы подтвердили, что, удалив его, JSON десериализует ОК.

мы используем эти опции как для сериализации, так и для десериализации:

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

Я заметил, что у Сигила на этой неделе было несколько обновлений nuget, не уверен, связано ли это с этим или нет.

Есть идеи?

ОБНОВЛЕНИЕ: Определение класса довольно длинное, но определение свойства heartbeat, которое выполняет или нарушает десериализацию, приведено ниже:

public DateTime Heartbeat { get; set; }

Это использует статическую десериализацию.

1 ответ

Одно возможное решение, включающее JSON.NET с помощью пользовательских 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}

Другие вопросы по тегам