Можете ли вы определить, был ли объект, десериализованный объект, отсутствием поля с 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
Я бы предпочел, чтобы исключение было брошено в молчание. Коротко, есть ли способ определить, не удалось ли сериализации найти параметр?
- Удаление десериализации JSON в объект с помощью Json.NET
- Использование JSON.NET для возврата ActionResult
- Json Сериализация Java, которая работает с GWT
- Использование преобразователей Json.NET для десериализации свойств
- Как использовать пользовательский Serializer с Jackson?
Я знаю, что могу анализировать данные с помощью объекта Json, а затем проверять параметр с помощью поиска по ключевым словам, но в кодовой базе я использую шаблон выше, и я бы хотел, чтобы это было согласовано, если это возможно.
- Удаление десериализации полиморфных classов json без информации о типе с использованием json.net
- Использование readObject / writeObject в сериализации
- Существуют ли эквиваленты C ++ для функций протокола ввода-вывода протокола Buffer в Java?
- jQuery serializeArray не включает кнопку отправки, которая была нажата
- Сериализовать компоненты JavaFX
- Получение ServiceStack для сохранения информации о типе
- Информация о сериализации типов кеша Json.NET?
- Автоматическая десериализация свойств C #
Сериализатор 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
, иначе это будет действительное значение. Это позволяет вам иметь дополнительные настройки и оценивать их по умолчанию.