Я пытаюсь справиться с десерализацией объекта, который не соответствует некоторым моим классам.Я хотел бы, чтобы код выполнялся и не выполнялся только для недопустимых атрибутов, но метод десереализации возвращает нулевой объект.
Я использую этот метод в универсальном служебном классе, который десериализует некоторую строку для любого заданного типа.
Из тестового кода обработчик ошибок корректно работает с недопустимыми датами и другими недопустимыми типами и возвращает объект со значениями инициализации .NET по умолчанию.
Если я изменяю (или комментирую) коллекцию Itemsв подобъекте код работает.
string json = "{\"Id\":8,\"CreatedByUserId\":0,\"CreatedOnDate\":\"2019X-Y02Z-W06T18:A51:05.783\",\"LastModifiedByUserId\":1,\"LastModifiedOnDate\":\"2019-03-12T17:00:34.82\",\"OperationData\":{\"IsActive\":true,\"Items\":[{\"_Id\":1,\"Id_Value\":0,\"Id\":1},{\"_Id\":2,\"Id\":2},{\"Id\":1,\"IsDeleted\":false,\"Content\":{}}]}}";
TestType test = DeserealizeContent(json);
/*The convertion utility*/
private static TestType DeserealizeContent(string data)
{
var settings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
MissingMemberHandling = MissingMemberHandling.Ignore,
Error = HandleDeserializationError
};
var r = JsonConvert.DeserializeObject<TestType>(data, settings);
return r;
}
public static void HandleDeserializationError(object sender, ErrorEventArgs errorArgs)
{
errorArgs.ErrorContext.Handled = true;
}
/*Supporting types*/
public class TestType {
public int Id { get; set; }
public DateTime CreatedOnDate { get; set; }
public int CreatedByUserId { get; set; }
public string Instructions { get; set; }
public OperationDataType OperationData {get;set;}
}
public class OperationDataType {
public bool IsActive { get; set; }
public List<int> Items { get; set; }
}
Я ожидал, что обработчик ошибок перехватит обработку исключительной ситуации и продолжит процесс, но вместо этого десериализация просто возвращает ноль в конце.
Если я изменю элементы списка на элементы списка, результат будет правильно проанализирован.
Мой ожидаемый результат будет: {"Id": 8, "CreatedByUserId": 0, "CreatedOnDate": null, "LastModifiedByUserId":1, «LastModifiedOnDate»: «2019-03-12T17: 00: 34.82», «OperationData»: {«IsActive»: true, «Items»: null}}
РЕДАКТИРОВАТЬ - обходной путь
Предложение от Яир (ниже) работает.Переключение из списка в список работает, как ожидалось, и исключение правильно обрабатывается.