Можно ли каким-то образом поймать остаток от JSON данных, которые не соответствуют никаким свойствам POCO во время десериализации? - PullRequest
3 голосов
/ 03 августа 2020

Я получаю некоторые JSON данные из внешнего API. У меня есть объекты POCO, в которые десериализованы данные. Я использую System.Text. Json .JsonSerializer для десериализации. Недавно я понял, что структура JSON, которую я получаю, изменилась, и я узнал об этом только случайно, проверяя что-то еще. Мой вопрос: можно ли каким-то образом уловить данные json, которые не удалось сопоставить ни с одним полем POCO?

Чтобы быть более точным с моим вопросом, вот пример POCO:

public class Car
{
    public string Name { get; set; }
    public int Age { get; set; }
}

JSON, которые я получил раньше:

{"Name" : "PinkCar", "Age": 3}

JSON, которые я получаю сейчас:

{"Name" : "PinkCar", "Age": 3, "RogueField": "Loser"}

Я хотел бы иметь возможность хотя бы получить какая-то информация о том, что есть это новое "RogueField", которое не соответствует никаким свойствам POCO без нарушения процесса десериализации.

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Дополнительные свойства могут быть сохранены в словаре с вашим объектом. Вы можете управлять этим каталогом, и он будет использоваться при повторной сериализации вашего объекта.

From https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-how-to#handle -overflow- json: создайте свойство типа Dictionary<string, object>, это может иметь любое имя (обычно это ExtensionData, но может быть любым) и украшать его атрибутом [JsonExtensionData], например:

public class Car
{
    public string Name { get; set; }
    public int Age { get; set; }
    [JsonExtensionData]
    public Dictionary<string, object> ExtensionData { get; set; }
}
2 голосов
/ 03 августа 2020

К сожалению, в настоящее время нет возможности использовать объекты System.Text.Json, которые являются частью. NET Core. В настоящее время он не поддерживается .

Вы можете использовать Newtonsoft JSON, например:

var settings = new JsonSerializerSettings
{
    MissingMemberHandling = MissingMemberHandling.Error
};

var result = Newtonsoft.Json.JsonConvert.DeserializeObject<Car>(json, settings);

Теперь, когда ваш POCO пропускает какие-либо поля, он выдаст JsonSerializationException:

JsonSerializationException: не удалось найти член RogueField в объекте типа Car. Путь 'RogueField', строка 1, позиция 44.

...