Ошибка десериализации Newtonsoft JSON.net, где поля в порядке изменения JSON

Это служба WCF, получающая запросы от устройств Android. Тот же запрос работает от устройств Lollipop, а не от устройств из желе, потому что jellybean по-разному создает JSON при создании.

Исключение:

Неожиданный токен при десериализации объекта: String. Путь ‘SearchFilters.config. $ Type’, строка 1, позиция 212.

Не работает Json:

{ "DeviceType": 2, "SearchFilters": { "config": { "$values": [ { "Collection": { "DeviceType": 2 }, "Category": "" } ], "$type": "System.Collections.Generic.List`1[[Yoosh.SharedClasses.YooshConfig, YooshSharedClassesDll]], mscorlib" } }, "RequestingUserId": "66666666-6666-6666-6666-666666666666", "APIKey": "xxx" } 

Рабочий Джон:

 { "APIKey": "xxx", "DeviceType": 2, "RequestingUserId": "66666666-6666-6666-6666-666666666666", "SearchFilters": { "config": { "$type": "System.Collections.Generic.List`1[[Yoosh.SharedClasses.YooshConfig, YooshSharedClassesDll]], mscorlib", "$values": [ { "Category": "", "Collection": { "DeviceType": 2 } } ] } } } 

Некоторые поля находятся в другом порядке. Это единственное различие.

Класс C #:

 public class QueryParameters { BaseParameters m_baseParameters; Guid m_gRequestingUserId; Dictionary m_SearchFilters; [DataMember] public string APIKey { get { return m_baseParameters.APIKey; } set { m_baseParameters.APIKey = value; } } [DataMember] public BaseParameters.YooshDeviceType DeviceType { get { return m_baseParameters.DeviceType; } set { m_baseParameters.DeviceType = value; } } [DataMember] public string DeviceId { get { return m_baseParameters.DeviceId; } set { m_baseParameters.DeviceId = value; } } [DataMember] public Guid RequestingUserId { get { return m_gRequestingUserId; } set { m_gRequestingUserId = value; } } [DataMember] public Dictionary SearchFilters { get { return m_SearchFilters; } set { m_SearchFilters = value; } } } 

Версия Json.net: 6.0.8

Установите JsonSerializerSettings.MetadataPropertyHandling = MetadataPropertyHandling.ReadAhead .

Согласно документации :

Этот пример десериализует JSON с MetadataPropertyHandling, установленным в ReadAhead, так что свойства метаданных не должны находиться в начале объекта.

  string json = @"{ 'Name': 'James', 'Password': 'Password1', '$type': 'MyNamespace.User, MyAssembly' }"; object o = JsonConvert.DeserializeObject(json, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All, // $type no longer needs to be first MetadataPropertyHandling = MetadataPropertyHandling.ReadAhead }); 

Обратите внимание, что этот параметр повлияет на производительность .

Наконец, при использовании TypeNameHandling , обратите внимание на это предостережение от документов Newtonsoft :

TypeNameHandling следует использовать с осторожностью, когда ваше приложение десериализует JSON из внешнего источника. Входящие типы должны быть проверены с помощью специального SerializationBinder при десериализации со значением, отличным от None.

Для обсуждения того, почему это может быть необходимо, см. В описании TypeNameHandling в Newtonsoft Json .

  • Разбор JSON DateTime от JSON Serializer от Newtonsoft
  • Newtonsoft JSON Deserialize
  • Обнаружен цикл саморегуляции - Возврат данных из WebApi в браузер
  • Хранить корпус при сериализации словарей
  • Серийный объект Json.NET с корневым именем
  • Как настроить пользовательские настройки JsonSerializer для Json.NET в веб-API MVC 4?
  • Не удалось загрузить файл или сборку «Newtonsoft.Json, Version = 4.5.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed»
  • Как игнорировать неизвестные значения enum во время десериализации json?
  • JSON.NET и nHibernate Lazy Загрузка коллекций
  • Как вернуть объект JSon
  • Как я могу разбирать JSON с C #?
  • Interesting Posts

    Непотенциальное размещение объектов

    java чтение файла с сетевого устройства

    HK2 не вводит HttpServletRequest трикотаж

    Каковы наилучшие методы структурирования большого приложения Meteor со многими файлами шаблонов HTML?

    Форвардное объявление typedef в C ++

    Сбой и ожидающие обновления: «перезагрузите компьютер для установки важных обновлений»?

    Как настроить начальную страницу для отладки в приложении ASP.NET MVC?

    Повреждают ли драйверы Nvidia и Catalyst друг с другом?

    Является ли такое же преобразование?

    Как загрузить локальный файл на сервер через терминал Linux

    Сброс стека навигации для главного экрана (React Navigation and React Native)

    Как установить надежный / гибкий GRUB для многопользовательской загрузки (Windows, Linux)?

    Linux: несколько сетевых подключений – 3G / 4G / Wifi / LAN / etc; Как я могу установить предпочтительное сетевое подключение для использования?

    Как переключить некоторые основные ключи в Windows (гостевой Windows VirtualBox на хосте OSX)

    Использование инструкций IF и ISBLANK для определения диапазона ячеек, если какая-либо из них содержит информацию в них

    Давайте будем гением компьютера.