Отключить classы JSON до C #

Ниже представлен (слегка) урезанный ответ, который я получаю от REST API после успешного создания новой записи «код задания». Мне нужно десериализовать ответ на некоторые classы, но я в тупике.

Для справки, я использую JSON.NET в .NET 3.5 (работает в сценарии SSIS в SQL Server 2008 R2), чтобы попытаться выполнить десериализацию. Вот JSON, которого я, очевидно, не контролирую, поскольку он исходит из чужого API:

{ "results":{ "jobcodes":{ "1":{ "_status_code":200, "_status_message":"Created", "id":444444444, "assigned_to_all":false, "billable":true, "active":true, "type":"regular", "name":"1234 Main Street - Jackson" }, "2":{ "_status_code":200, "_status_message":"Created", "id":1234567890, "assigned_to_all":false, "billable":true, "active":true, "type":"regular", "name":"4321 Some Other Street - Jackson" } } } } 

В моем коде C # у меня есть определенный class JobCode, который только частично отображает значения JSON для свойств – меня не интересуют все данные, которые мне возвратили:

 [JsonObject] class JobCode { [JsonProperty("_status_code")] public string StatusCode { get; set; } [JsonProperty("_status_message")] public string StatusMessage { get; set; } [JsonProperty("id")] public string Id {get; set;} [JsonProperty("name")] public string Name { get; set; } //------------------------------------------------------------------------------- // Empty constructor for JSON serialization support //------------------------------------------------------------------------------- public JobCode() { } } 

Я пытаюсь десериализовать данные с помощью этого вызова:

 newResource = JsonConvert.DeserializeObject(jsonResponse); 

Где jsonResponse – это код, выведенный выше.
Когда я выполняю код, «newResource» всегда возвращается как null – что не является неожиданным, потому что я знаю, что на самом деле в данных есть несколько кодов задания, и этот код пытается десериализовать его в один объект JobCode. Я попытался создать новый class под названием «JobCodes», который выглядит так:

 class JobCodes { [JsonProperty("jobcodes")] public List_JobCodes { get; set; } } 

И затем я попытался назвать это:

 newResource = JsonConvert.DeserializeObject(jsonResponse); 

Но проблема сохраняется – мой объект возврата равен нулю. Что меня бросает, я думаю, это наличие идентификаторов «1» и «2». Я не знаю, как объяснить их присутствие в моем дизайне объектов и / или использовании атрибутов classа / свойства JSON.NET, таких как [JsonObject], [JsonProperty] и т. Д.

Когда я запускаю данные JSON через JSON2CSharp , он создает некоторые странные classы, поэтому он не оказался слишком эффективным. Я проверил JSON с несколькими различными валидаторами, и все это проверяется – я просто не знаю, чего я здесь не вижу.

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

Ваша проблема двоякая:

  1. У вас нет classа, определенного на корневом уровне. Структура classа должна соответствовать всему JSON, вы не можете просто десериализовать из середины.
  2. Всякий раз, когда у вас есть объект, ключи которого могут измениться, вам нужно использовать Dictionary . Обычный class не будет работать для этого; также не будет List .

Сделайте свои classы следующим:

 class RootObject { [JsonProperty("results")] public Results Results { get; set; } } class Results { [JsonProperty("jobcodes")] public Dictionary JobCodes { get; set; } } class JobCode { [JsonProperty("_status_code")] public string StatusCode { get; set; } [JsonProperty("_status_message")] public string StatusMessage { get; set; } [JsonProperty("id")] public string Id { get; set; } [JsonProperty("name")] public string Name { get; set; } } 

Затем десериализуйте вот так:

 RootObject obj = JsonConvert.DeserializeObject(json); 

Рабочая демонстрация здесь

Отличные ответы!

Для тех, кому может понадобиться дополнительная помощь в настройке classа JSON, попробуйте: http://json2csharp.com/#

Отличный способ автоматического создания classов!

Или еще проще, в VS, Goto:

Изменить -> Специальная вставка -> Вставить как classы JSON

Поскольку вы не можете изменить схему JSON, и вы не можете установить постоянное количество свойств, я бы предложил вам использовать JObject

 var jobject = JObject.Parse(json); var results = jobject["results"]; var jobcodes = results["jobcodes"]; var output = jobcodes.Children() .Select(prop => prop.Value.ToObject()) .ToList(); 

Предупреждение: код предполагает, что JSON всегда в правильной схеме. Вы также должны обрабатывать недопустимую схему (например, если свойство не JobCode схеме JobCode ).

  • Альтернативное имя свойства при десериализации
  • Ошибка десериализации Newtonsoft JSON.net, где поля в порядке изменения JSON
  • Как программно выбирать конструктор во время десериализации?
  • Как получить json.net для сериализации членов classа, полученных из List ?
  • Обнаружен цикл саморегуляции - Возврат данных из WebApi в браузер
  • Дезициализация свойств самореференции не работает
  • Как десериализовать данные JSON?
  • Сериализация / десериализация пользовательской коллекции с дополнительными свойствами с помощью Json.Net
  • Deserializing JSON, когда иногда массивы, а иногда и объекты
  • Обеспечение json-ключей в .NET
  • Строка Parse Json в C #
  • Interesting Posts

    Получение специального источника ABS от ABAddressBook в iOS 4+

    Блокировка, мьютексы, семафор … в чем разница?

    Как бороться с ошибкой «данных classа uneval» от ggplot2?

    Преобразование Enum в String

    Как SCP от сервера linux к клиенту Windows

    Возвращает $ .get данные в функции с помощью jQuery

    Конфликт AngularJS-Twig с двойными фигурными фигурными скобками

    Как разрешить ошибку «Ресурс не найден, который соответствует указанному имени» при добавлении библиотеки v7 AppCompat в Eclipse?

    Как справиться с базовой аутентификацией в WebView

    Как настроить VLAN в той же подсети, что и Ethernet

    Запуск приложения в GDB до тех пор, пока не произойдет исключение

    Не удалось установить библиотеки Python

    Visual Studio 2013 IntelliSense перестает работать для controllerов ASP.NET MVC5

    Есть ли способ скопировать пути файлов из всех открытых открытых файлов Windows? (Для сохранения и восстановления сеанса Windows во время перезапуска)

    Пользовательская обработка SSL перестала работать на Android 2.2 FroYo

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