Отключить 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 в IEnumerable с помощью Newtonsoft JSON.NET
  • Не удалось загрузить файл или сборку «Newtonsoft.Json» или одну из его зависимостей. Определение манифеста не соответствует ссылке на сборку
  • Как конвертировать JSON в XML или XML в JSON?
  • Могу ли я сериализовать вложенные свойства в мой class за одну операцию с помощью Json.net?
  • Как я могу десериализовать JSON для простого словаря в ASP.NET?
  • C # WCF REST. Как вы используете сериализатор JSON.Net вместо стандартного DataContractSerializer?
  • Не удалось загрузить файл или сборку «Newtonsoft.Json, Version = 4.5.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed»
  • Разбор большого json-файла в .NET.
  • Строка Parse Json в C #
  • Сериализовать словарь как массив (пар ключей)
  • Как настроить пользовательские настройки JsonSerializer для Json.NET в веб-API MVC 4?
  • Давайте будем гением компьютера.