Десериализация JSON с использованием JSon.NET с динамическими данными

Я пытаюсь десериализовать некоторые данные JSON в объекты для приложения. До сих пор это было прекрасно, потому что свойства данных JSON были статическими (ключ со значением). Теперь у меня есть результат, когда ключ является динамической частью данных.

Вот пример JSON url:

http://en.wikipedia.org/w/api.php?action=query&format=json&pageids=6695&prop=info

В результате JSON для этого:

{ "query" : { "pages" : { "6695" : { "counter" : "", "lastrevid" : 468683764, "length" : 8899, "ns" : 0, "pageid" : 6695, "title" : "Citadel", "touched" : "2012-01-03T19:16:16Z" } } } } 

Хорошо, это здорово, за исключением того, что я не могу десериализовать данные «страниц» в объекте. Если бы я определил class для страниц, он должен был бы выглядеть так:

 public class 6695 { public string counter { get; set; } public int lastrevid { get; set; } public int length { get; set; } public int ns { get; set; } public int pageid { get; set; } public string title { get; set; } public string touched { get; set; } } 

Чтобы десеризовать содержимое (используя JsonConvert.Deserialize (jsondata)), и все мы знаем, что мы не можем иметь class под названием 6695. Не только это, то имя classа должно быть другим (например, pageid = 7145 должен быть classом 7145).

Я могу показаться, что выкалываете некоторые значения, если я использую что-то вроде JObject.Parse (content), а затем обращаюсь к элементам как JArrays, но это довольно уродливо, и я все еще пытаюсь извлечь данные из массива страниц.

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

Благодаря!

PS забыл упомянуть об этом на Windows Phone 7, поэтому «динамический» недоступен!

Вот как вы это делаете, используя https://github.com/facebook-csharp-sdk/simple-json ( https://nuget.org/packages/SimpleJson ).

 var text = "{\"query\":{\"pages\":{\"6695\":{\"pageid\":6695,\"ns\":0,\"title\":\"Citadel\",\"touched\":\"2012-01-03T19:16:16Z\",\"lastrevid\":468683764,\"counter\":\"\",\"length\":8899}}}}"; 

(Использование динамического)

 dynamic json = SimpleJson.DeserializeObject(text); string title = json.query.pages["6695"].title; foreach (KeyValuePair page in json.query.pages) { var id = page.Key; var pageId = page.Value.pageid; var ns = page.Value.ns; } 

(Использование строго типизированных classов)

 class result { public query query { get; set; } } class query { public IDictionary pages { get; set; } } class page { public long pageid { get; set; } public string title { get; set; } } var result = SimpleJson.DeserializeObject(text); 

[Обновить]

на телефоне Windows, где динамика не поддерживается, и вы не хотите использовать строго типизированные classы.

 var json = (IDictionary)SimpleJson.DeserializeObject(text); var query = (IDictionary)json["query"]; var pages = (IDictionary)query["pages"]; var pageKeys = pages.Keys; var page = (IDictionary)pages["6695"]; var title = (string)page["title"]; 

Простейший метод. В этом конкретном случае, вероятно, будет идти dynamic .

 dynamic data = Newtonsoft.Json.JsonConvert.DeserializeObject(json); var lastRevId = data.query.pages["6695"].lastrevid; 

Вы можете ссылаться на любой элемент по имени [] чтобы вы могли делать что-то вроде data["query"]["pages"]["6695"]["lastrevid"] . Это получит все те маленькие объекты, где имя недействительно в c #.

Используя Json.net, вы можете просто сделать:

 Dictionary result = JsonConvert.DeserializeObject>(json); foreach(var item in result) Console.WriteLine(item.Key + " " + item.Value); 

Надеюсь, что приведенный ниже пример поможет. Я всегда разрабатываю модель, которая соответствует json. Гораздо лучше работать с объектом, когда это ваш собственный дизайн модели.

Очень легко сгенерировать модель c # из json. Я использую этот сайт для создания модели: http://json2csharp.com

Полный пример:

Код C #:

  var targetsObject = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString); 

JSON:

  { "investors": [ { "name": "06", "programs": [ { "name": "Conventional", "value": "3.5" }, { "name": "FHA - Standard", "value": "5.0" }, { "name": "FHA - Streamline", "value": "" }, { "name": "VA", "value": "5.5" }, { "name": "VA IRRRL", "value": "6.0" }, { "name": "Non-Prime", "value": "" } ] }, { "name": "07", "programs": [ { "name": "Conventional", "value": "3.5" }, { "name": "FHA - Standard", "value": "5.0" }, { "name": "FHA - Streamline", "value": "7.0" }, { "name": "VA", "value": "5.5" }, { "name": "VA IRRRL", "value": "" }, { "name": "Non-Prime", "value": "" } ] }, { "name": "08", "programs": [ { "name": "Conventional", "value": "3.5" }, { "name": "FHA - Standard", "value": "5.0" }, { "name": "FHA - Streamline", "value": "7.0" }, { "name": "VA", "value": "5.5" }, { "name": "VA IRRRL", "value": "" }, { "name": "Non-Prime", "value": "" } ] }, { "name": "09", "programs": [ { "name": "Conventional", "value": "3.5" }, { "name": "FHA - Standard", "value": "5.0" }, { "name": "FHA - Streamline", "value": "" }, { "name": "VA", "value": "5.5" }, { "name": "VA IRRRL", "value": "" }, { "name": "Non-Prime", "value": "" } ] }, { "name": "10", "programs": [ { "name": "Conventional", "value": "" }, { "name": "FHA - Standard", "value": "" }, { "name": "FHA - Streamline", "value": "" }, { "name": "VA", "value": "" }, { "name": "VA IRRRL", "value": "" }, { "name": "Non-Prime", "value": "2.0" } ] }, { "name": "11", "programs": [ { "name": "Conventional", "value": "3.5" }, { "name": "FHA - Standard", "value": "5.0" }, { "name": "FHA - Streamline", "value": "" }, { "name": "VA", "value": "6.0" }, { "name": "VA IRRRL", "value": "6.0" }, { "name": "Non-Prime", "value": "" } ] }, { "name": "12", "programs": [ { "name": "Conventional", "value": "3.5" }, { "name": "FHA - Standard", "value": "5.0" }, { "name": "FHA - Streamline", "value": "" }, { "name": "VA", "value": "5.5" }, { "name": "VA IRRRL", "value": "6.0" }, { "name": "Non-Prime", "value": "" } ] }, { "name": "13", "programs": [ { "name": "Conventional", "value": "" }, { "name": "FHA - Standard", "value": "5.0" }, { "name": "FHA - Streamline", "value": "" }, { "name": "VA", "value": "" }, { "name": "VA IRRRL", "value": "" }, { "name": "Non-Prime", "value": "2.0" } ] } ] } 

Модель:

  public class Program { public string name { get; set; } public string value { get; set; } } public class Investor { public string name { get; set; } public List programs { get; set; } } public class RootObject { public List investors { get; set; } } 

Как насчет простого поиска и замены в строке JSON? Хотя это может быть не самое элегантное решение, оно, возможно, будет самым прагматичным.

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

  • Json.NET Отключить десериализацию в DateTime
  • Как сериализовать объект, который включает BufferedImages
  • Как реализовать пользовательский JsonConverter в JSON.NET для десериализации списка объектов базового classа?
  • Дезерминирование полиморфных типов с jacksonом
  • Сериализация Java - java.io.InvalidClassException локальный class несовместим
  • Преобразование int для bool с Json.Net
  • Дезаминирование гетерогенного массива JSON в ковариантный список с использованием JSON.NET
  • Удаление десериализации JSON в .NET-объект с использованием Newtonsoft (или LINQ to JSON, возможно?)
  • Уничтожить XML-объект с помощью динамического
  • Как я могу разбирать JSON с C #?
  • Давайте будем гением компьютера.