Отключить 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, но я не понимаю, что мне нужно сделать, чтобы это произошло.

3 Solutions collect form web for “Отключить classы JSON до C #”

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

  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 ).

  • Удалить дескриптор объекта json в динамический объект с помощью Json.net
  • Как я могу десериализовать JSON для простого словаря в ASP.NET?
  • Создайте строго типизированный объект c # из объекта json с ID как имя
  • Как обрабатывать как отдельный элемент, так и массив для одного и того же свойства с помощью JSON.net
  • Newtonsoft JSON Deserialize
  • Можно ли указать путь в атрибуте для сопоставления свойства в моем classе с дочерним свойством в моем JSON?
  • Указание пользовательского формата DateTime при сериализации с помощью Json.Net
  • ТипNameHandling предостережение в Newtonsoft Json
  • Интерфейсы для десериализации в JSON.NET
  • Разбор JSON с использованием Json.net
  • Как изменить имена свойств при сериализации с помощью Json.net?
  • Interesting Posts

    Преобразование данных JSON в объект Java

    Ошибка “Thread 1: точка останова 2.1”

    Диалоговое окно «Открыть файл с» при запуске?

    Требуется ли учетная запись администратора для использования оболочек, таких как zsh и fish?

    Миллионы 3D-точек: как найти 10 из них ближе всего к данной точке?

    Достижение скорости на современной конструкции ПК

    Клонирование установки Windows (при использовании) на новый диск, не выходя из Windows

    Минимальная ОС для запуска виртуальных машин

    Используется несколько интернет-подключений.

    Как найти значения Hex, которые мне нужно использовать для потока ниже?

    Как изменить диапазон dhcp, выделенный через ICS в диапазоне от Windows 7 до 192.168.1.x?

    Модель, используемая для открытия магазина, несовместима с той, которая используется для создания магазина

    Android Studio внезапно не может разрешить символы

    Если кто-то скачал 600 ГБ, это может быть атака DOS

    Каков наилучший способ отключить неиспользованную беспроводную клавиатуру в диапазоне рабочих приемников?

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