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