Дессериализация данных JSON на C # с использованием JSON.NET

Я относительно новичок в работе с данными C # и JSON, и я ищу руководство. Я использую C # 3.0, с .NET3.5SP1 и JSON.NET 3.5r6.

У меня есть определенный class C #, который мне нужно заполнить из структуры JSON. Однако не каждая структура JSON для записи, полученной из веб-службы, содержит все возможные атрибуты, которые определены в classе C #.

Я делаю то, что кажется неправильным, трудным путем и просто выбираю каждое значение по одному из JObject и преобразуя строку в требуемое свойство classа.

JsonSerializer serializer = new JsonSerializer(); var o = (JObject)serializer.Deserialize(myjsondata); MyAccount.EmployeeID = (string)o["employeeid"][0]; 

Каков наилучший способ десериализации структуры JSON в class C # и обработка возможных отсутствующих данных из источника JSON?

Мой class определяется как:

  public class MyAccount { [JsonProperty(PropertyName = "username")] public string UserID { get; set; } [JsonProperty(PropertyName = "givenname")] public string GivenName { get; set; } [JsonProperty(PropertyName = "sn")] public string Surname { get; set; } [JsonProperty(PropertyName = "passwordexpired")] public DateTime PasswordExpire { get; set; } [JsonProperty(PropertyName = "primaryaffiliation")] public string PrimaryAffiliation { get; set; } [JsonProperty(PropertyName = "affiliation")] public string[] Affiliation { get; set; } [JsonProperty(PropertyName = "affiliationstatus")] public string AffiliationStatus { get; set; } [JsonProperty(PropertyName = "affiliationmodifytimestamp")] public DateTime AffiliationLastModified { get; set; } [JsonProperty(PropertyName = "employeeid")] public string EmployeeID { get; set; } [JsonProperty(PropertyName = "accountstatus")] public string AccountStatus { get; set; } [JsonProperty(PropertyName = "accountstatusexpiration")] public DateTime AccountStatusExpiration { get; set; } [JsonProperty(PropertyName = "accountstatusexpmaxdate")] public DateTime AccountStatusExpirationMaxDate { get; set; } [JsonProperty(PropertyName = "accountstatusmodifytimestamp")] public DateTime AccountStatusModified { get; set; } [JsonProperty(PropertyName = "accountstatusexpnotice")] public string AccountStatusExpNotice { get; set; } [JsonProperty(PropertyName = "accountstatusmodifiedby")] public Dictionary AccountStatusModifiedBy { get; set; } [JsonProperty(PropertyName = "entrycreatedate")] public DateTime EntryCreatedate { get; set; } [JsonProperty(PropertyName = "entrydeactivationdate")] public DateTime EntryDeactivationDate { get; set; } } 

И образец JSON для parsingа:

 { "givenname": [ "Robert" ], "passwordexpired": "20091031041550Z", "accountstatus": [ "active" ], "accountstatusexpiration": [ "20100612000000Z" ], "accountstatusexpmaxdate": [ "20110410000000Z" ], "accountstatusmodifiedby": { "20100214173242Z": "tdecker", "20100304003242Z": "jsmith", "20100324103242Z": "jsmith", "20100325000005Z": "rjones", "20100326210634Z": "jsmith", "20100326211130Z": "jsmith" }, "accountstatusmodifytimestamp": [ "20100312001213Z" ], "affiliation": [ "Employee", "Contractor", "Staff" ], "affiliationmodifytimestamp": [ "20100312001213Z" ], "affiliationstatus": [ "detached" ], "entrycreatedate": [ "20000922072747Z" ], "username": [ "rjohnson" ], "primaryaffiliation": [ "Staff" ], "employeeid": [ "999777666" ], "sn": [ "Johnson" ] } 

Используйте JsonConvert.DeserializeObject(string json);

Создайте свои classы на JSON 2 C #


Документация Json.NET: Сериализация и десериализация JSON с Json.NET

Пробовали ли вы использовать общий метод DeserializeObject?

 JsonConvert.DeserializeObject(myjsondata); 

Любые отсутствующие поля в данных JSON должны просто оставить NULL.

ОБНОВИТЬ:

Если строка JSON является массивом, попробуйте следующее:

 var jarray = JsonConvert.DeserializeObject>(myjsondata); 

jarray должен быть List .

ДРУГОЕ ОБНОВЛЕНИЕ:

Исключение, которое вы получаете, не согласуется с массивом объектов – я думаю, что у сериализатора возникли проблемы с вашим свойством Accountstatusmodifiedby с помощью словаря.

Попробуйте исключить свойство accountstatusmodifiedby из сериализации и посмотрите, поможет ли это. Если это так, вам может потребоваться представить это свойство по-разному.

Документация: Сериализация и десериализация JSON с помощью Json.NET

Ответ воспроизведен с https://stackoverflow.com/a/10718128/776476

Вы можете использовать dynamic тип C #, чтобы упростить задачу. Этот метод также упрощает повторный факторинг, поскольку он не полагается на магические струны.

Json

Строка json ниже – это простой ответ от вызова http api и определяет два свойства: Id и Name .

 {"Id": 1, "Name": "biofractal"} 

C #

Используйте JsonConvert.DeserializeObject() чтобы десериализовать эту строку в динамический тип, а затем просто получить доступ к ее свойствам обычным способом.

 var results = JsonConvert.DeserializeObject(json); var id = results.Id; var name= results.Name; 

Примечание . Ссылка NuGet для сборки NewtonSoft – http://nuget.org/packages/newtonsoft.json . Не забудьте добавить: using Newtonsoft.Json; для доступа к этим classам.

Вы можете использовать:

 JsonConvert.PopulateObject(json, obj); 

здесь: json – это строка json, obj – целевой объект. См .: пример

Примечание. PopulateObject() не будет удалять данные списка obj, после того, как Populate() , член списка obj's будет содержать свои исходные данные и данные из строки json

Основываясь на ответе bbant, это мое полное решение для десериализации JSON с удаленного URL.

 using Newtonsoft.Json; using System.Net.Http; namespace Base { public class ApiConsumer { public T data; private string url; public CalendarApiConsumer(string url) { this.url = url; this.data = getItems(); } private T getItems() { T result = default(T); HttpClient client = new HttpClient(); // This allows for debugging possible JSON issues var settings = new JsonSerializerSettings { Error = (sender, args) => { if (System.Diagnostics.Debugger.IsAttached) { System.Diagnostics.Debugger.Break(); } } }; using (HttpResponseMessage response = client.GetAsync(this.url).Result) { if (response.IsSuccessStatusCode) { result = JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result, settings); } } return result; } } } 

Использование будет выглядеть так:

 ApiConsumer feed = new ApiConsumer("http://example.info/feeds/feeds.aspx?alt=json-in-script"); 

Где FeedResult – это class, сгенерированный с использованием генератора classов Xamasoft JSON

Вот скриншот настроек, которые я использовал, с учетом странных имен свойств, которые веб-версия не могла учитывать.

Генератор класса Xamasoft JSON

Вы можете попробовать проверить некоторые из генераторов classов в Интернете для получения дополнительной информации. Тем не менее, я считаю, что некоторые из ответов были полезны. Вот мой подход, который может быть полезен.

Следующий код был сделан с учетом динамического метода.

 dynObj = (JArray)JsonConvert.DeserializeObject(nvm); foreach (JObject item in dynObj) { foreach (JObject trend in item["trends"]) { Console.WriteLine("{0}-{1}-{2}", trend["query"], trend["name"], trend["url"]); } } 

Этот код в основном позволяет вам обращаться к членам, содержащимся в строке Json. Просто по-другому, без необходимости в classах. query , trend и url – это объекты, содержащиеся в строке Json.

Вы также можете использовать этот сайт . Не доверяйте classам 100%, но вы получаете эту идею.

Я обнаружил, что неправильно построил свой объект. Я использовал http://json2csharp.com/ для создания моего classа объектов из JSON. Как только у меня был правильный Oject, я смог бросить без проблем. Норбит, ошибка Нооба. Думал, что добавлю его, если у вас будет такая же проблема.

Предполагая, что ваши данные выборки верны, ваше имя и другие записи, заключенные в скобки, являются массивами в JS … вы хотите использовать List для этих типов данных. и List для say accountstatusexpmaxdate … Я думаю, что вы, например, неверно отформатировали даты, поэтому не знаете, что еще неверно в вашем примере.

Это старый пост, но хотелось бы обратить внимание на проблемы.

  • Как использовать JSON.NET для десериализации в вложенный / рекурсивный словарь и список?
  • Уничтожить XML-объект с помощью динамического
  • Newtonsoft JSON Deserialize
  • Дезаминирование гетерогенного массива JSON в ковариантный список с использованием JSON.NET
  • Дезерминирование полиморфных типов с jacksonом
  • Разбор большого json-файла в .NET.
  • Отключить JSON в существующий объект (Java)
  • JSON для экземпляра classа TypeScript?
  • Преобразование int для bool с Json.Net
  • Можно ли указать путь в атрибуте для сопоставления свойства в моем classе с дочерним свойством в моем JSON?
  • Interesting Posts

    Google Maps V3 – Как рассчитать уровень масштабирования для заданных границ

    Почему я получаю ошибку … неожиданный запрос: GET / internalapi / quotes

    Как восстановить данные с зашифрованного жесткого диска, который был снесен «резервным разделом Microsoft»,

    Передача аргументов AsyncTask и возrotation результатов

    Разделите локальные файлы на разных серверах с ограниченным пространством с помощью rsync

    В чем смысл использования подчеркивания в Scala?

    Почему нет replaceAll работать в этой строке кода?

    Windows Vista застряла

    Метод / продукт для очистки сигаретного дыма от ЖК-дисплеев?

    Почему внутренние classы делают доступными частные методы?

    Как добавить значок в свой пользовательский элемент контекстного меню в Windows 7?

    Как подсчитать количество вхождений элемента в список

    Определить версию сборки (CLR) сборки

    Водяное охлаждение ПК, это действительно дорого?

    Что такое VTT для classа?

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