Отключить 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 ).

  • Сериализация / десериализация пользовательской коллекции с дополнительными свойствами с помощью Json.Net
  • Каков правильный способ использования JSON.NET для анализа streamа объектов JSON?
  • Как можно десериализовать дочерний объект с динамическими (числовыми) именами клавиш?
  • Json.Net: свойство Serialize / Deserialize в качестве значения, а не как объект
  • Как вернуть объект JSon
  • Как конвертировать JSON в XML или XML в JSON?
  • JSON.NET: зачем использовать JToken - когда-либо?
  • В чем разница между PreserveReferencesHandling и ReferenceLoopHandling в Json.Net?
  • C # WCF REST. Как вы используете сериализатор JSON.Net вместо стандартного DataContractSerializer?
  • Json.net сериализует определенное частное поле
  • Как игнорировать неизвестные значения enum во время десериализации json?
  • Interesting Posts

    Могу ли я локализовать UIDatePicker?

    Объявление активности в AndroidManifest.xml

    Запустите ноутбук от сети переменного тока без зарядки аккумулятора

    командный файл: список rar-файла в определенной папке и запись результата в текстовый файл

    Как я сериализую значение enum как int?

    Необоснованное использование ОЗУ в Windows 7

    Как контролировать папку и запускать действие командной строки при создании или редактировании файла?

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

    Обрезка огромного (3,5 ГБ) файла csv для чтения в R

    Каков наиболее рекомендуемый способ хранения времени в PostgreSQL с помощью Java?

    BIOS поврежден? Как действовать? Acer Travelmate 290

    Какая разница в том, использует ли компьютер USB-адаптер Ethernet или сетевую карту?

    Как проверить выравнивание разделов на накопителе SSD?

    Является ли более высокая частота ядра или более высокая тактовая частота более полезной для производительности компьютера?

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

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