Можете ли вы определить, был ли объект, десериализованный объект, отсутствием поля с classом JsonConvert в Json.NET
Я пытаюсь десериализовать некоторые объекты Json с помощью Json.NET. Однако я обнаружил, что когда я десериализую объект, у которого нет свойств, которые я ищу, нет ошибки, но значение свойства по умолчанию возвращается для свойств при доступе к ним. Очень важно, что я могу определить, когда я десериализую неправильный тип объекта. Пример кода:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; namespace Json_Fail_Test { class Program { [JsonObject(MemberSerialization.OptOut)] private class MyJsonObjView { [JsonProperty("MyJsonInt")] public int MyJsonInt { get; set; } } const string correctData = @" { 'MyJsonInt': 42 }"; const string wrongData = @" { 'SomeOtherProperty': 'fbe8c20b' }"; static void Main(string[] args) { var goodObj = JsonConvert.DeserializeObject(correctData); System.Console.Out.WriteLine(goodObj.MyJsonInt.ToString()); var badObj = JsonConvert.DeserializeObject(wrongData); System.Console.Out.WriteLine(badObj.MyJsonInt.ToString()); } } }
Результат этой программы: 42 0
Я бы предпочел, чтобы исключение было брошено в молчание. Коротко, есть ли способ определить, не удалось ли сериализации найти параметр?
- GSON десериализует значение ключа для пользовательского объекта
- Django rest framework, используйте разные сериализаторы в том же ModelViewSet
- Невозможно сериализовать словарь с помощью сложного ключа с помощью Json.net
- Использование JSON.NET для возврата ActionResult
- Как вы сериализуете объект на C ++?
Я знаю, что могу анализировать данные с помощью объекта Json, а затем проверять параметр с помощью поиска по ключевым словам, но в кодовой базе я использую шаблон выше, и я бы хотел, чтобы это было согласовано, если это возможно.
- C # JSON.NET - десериализация ответа, использующего необычную структуру данных
- Можно ли выполнять бинарную сериализацию .NET в случае, если у вас нет исходного кода classа?
- Сериализация OpenCV Mat_
- Почему, когда конструктор аннотируется с помощью @JsonCreator, его аргументы должны быть аннотированы с помощью @JsonProperty?
- Как сериализовать объект в CSV-файл?
- «Тип не ожидается», используя DataContractSerializer - но это просто class, не смешные вещи?
- Получение ServiceStack для сохранения информации о типе
- Почему java.util.Optional не является Serializable, как сериализовать объект с такими полями
Сериализатор Json.Net имеет параметр MissingMemberHandling
который вы можете установить на « Error
. (По умолчанию – Ignore
.) Это приведет к тому, что сериализатор будет генерировать JsonSerializationException
во время десериализации всякий раз, когда он встречает свойство JSON, для которого нет соответствующего свойства в целевом classе.
static void Main(string[] args) { try { JsonSerializerSettings settings = new JsonSerializerSettings(); settings.MissingMemberHandling = MissingMemberHandling.Error; var goodObj = JsonConvert.DeserializeObject(correctData, settings); System.Console.Out.WriteLine(goodObj.MyJsonInt.ToString()); var badObj = JsonConvert.DeserializeObject (wrongData, settings); System.Console.Out.WriteLine(badObj.MyJsonInt.ToString()); } catch (Exception ex) { Console.WriteLine(ex.GetType().Name + ": " + ex.Message); } }
Результат:
42 JsonSerializationException: Could not find member 'SomeOtherProperty' on object of type 'MyJsonObjView'. Path 'SomeOtherProperty', line 3, position 33.
Просто добавьте [JsonProperty(Required = Required.Always)]
к требуемым свойствам, и он будет генерировать исключение, если свойство не существует при десериализации.
[JsonProperty(Required = Required.Always)] public int MyJsonInt { get; set; }
Поместите следующие атрибуты на требуемые свойства:
[DataMember(IsRequired = true)]
Если член отсутствует, он выкинет исключение Newtonsoft.Json.JsonSerializationException.
Как предложил Брайан ниже, вам также понадобится этот атрибут для вашего classа:
[DataContract]
Просто определите своих членов в classе определения с вопросительным знаком «?» int?
:
private class MyJsonObjView { [JsonProperty("MyJsonInt")] public int? MyJsonInt { get; set; } }
Если он не инициализирован, он будет равен null
, иначе это будет действительное значение. Это позволяет вам иметь дополнительные настройки и оценивать их по умолчанию.