Чтобы не потерять свойства JSON при десериализации в POCO, в котором отсутствуют элементы, я использую атрибут [JsonExtensionData]
. Пример:
public class Foo
{
public int Y { get; set; }
[JsonExtensionData]
private IDictionary<string, JToken> _extraStuff;
}
Таким образом, если я попытаюсь десериализовать следующее, я не потеряю свойство z
:
{
"y": 1,
"z": "added in foo"
}
Пока все хорошо.
Но на самом деле у меня очень глубокий объектный граф. Поэтому каждый POCO на графике должен использовать атрибут [JsonExtensionData]
. Это немного опасно. Как только я забуду добавить это в один из классов, выполнение десериализации с последующей сериализацией приведет к потере данных. (реальный вариант использования - HTTP GET, за которым следует HTTP POST, и я хочу быть уверенным, что ничего не потеряю)
Итак, чтобы быть уверенным, что я не забыл [JsonExtensionData]
Во всем моем дереве объектов POCO я подумал об использовании следующей настройки десериализатора:
var serializerSettings = new JsonSerializerSettings
{
MissingMemberHandling = MissingMemberHandling.Error
};
Но тогда, если я попытаюсь десериализовать предыдущий JSON, я получу следующее исключение:
Could not find member 'z' on object of type 'Foo'. Path 'z', line 3, position 6.
Это довольно раздражает, оно жалуется на поле, которое не имеет члена в POCO, но покрыто атрибутом [JsonExtensionData]
.
Есть ли способ вызвать ошибки , когда данные фактически теряются во время десериализации?