Смешайте [JsonExtensionData] с MissingMemberHandling.Error с JSON.NET - PullRequest
2 голосов
/ 02 октября 2019

Чтобы не потерять свойства 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].

Есть ли способ вызвать ошибки , когда данные фактически теряются во время десериализации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...