Newtonsoft JSON Десеріалізувати


83

Мій JSON такий:

{"t":"1339886","a":true,"data":[],"Type":[['Ants','Biz','Tro']]}

Я знайшов бібліотеку десенсіалізації Newtonsoft JSON.NET для C #. Я намагався використовувати його наступним чином:

object JsonDe = JsonConvert.DeserializeObject(Json); 

Як я можу отримати доступ до JsonDeоб'єкта, щоб отримати всі дані "Тип"? Я спробував це з циклом, але він не працює, оскільки об’єкт не має перечислювача.



Ви повинні поглянути на відповідь на це запитання: stackoverflow.com/questions/11126242/…
Дітц,

Відповіді:


133

Ви можете реалізувати клас, який містить поля, які є у вашому JSON

class MyData
{
    public string t;
    public bool a;
    public object[] data;
    public string[][] type;
}

а потім використовувати загальну версію DeserializeObject:

MyData tmp = JsonConvert.DeserializeObject<MyData>(json);
foreach (string typeStr in tmp.type[0])
{
    // Do something with typeStr
}

Документація: Серіалізація та десеріалізація JSON


Я щойно додав приклад, який повинен бути корисним. Для мене загадкою, чому "тип" - це список списків (масив масиву) - але це повинно узгоджуватися з рядком json, який ви дали.
Michael Banzon,

1
Велике спасибі за вашу відповідь. Це допомогло мені вирішити мою проблему :)
santosh kumar patro

Я використовував гіпс, який зазнав невдачі MyData tmp = (MyData)JsonConvert.DeserializeObject(json);. Загальна версія десериалізації працює набагато краще, дякую. :-)
SharpC

Добре, я пишу це тут: dotnet add package Newtonsoft.Jsonі using Newtonsoft.Json;.
dani

82

Набагато простіше рішення: використання динамічного типу

Станом на Json.NET 4.0, випуск 1, існує рідна динамічна підтримка. Вам не потрібно оголошувати клас, просто використовуйте dynamic:

dynamic jsonDe = JsonConvert.DeserializeObject(json);

Будуть доступні всі поля:

foreach (string typeStr in jsonDe.Type[0])
{
    // Do something with typeStr
} 

string t = jsonDe.t;
bool a = jsonDe.a;
object[] data = jsonDe.data;
string[][] type = jsonDe.Type;

За допомогою динамічного не потрібно створювати певний клас для зберігання ваших даних.


10
хороший відповідь, спасибі за представляючи мене dynamic:)
maialithar

2
Це, безумовно, просто. Але він має той недолік, що не може легко перевірити, чи існує властивість (слід використовувати обробку винятків).
Джовен

2
@Jowen Щоб перевірити, чи існує властивість без обробки винятків, подивіться на ці відповіді
Yves M.

велике спасибі 1 !! найпростіше рішення, яке я так довго
шукав

9

Відповідно до документації Newtonsoft, ви також можете десериалізувати анонімний об’єкт, як це:

var definition = new { Name = "" };

string json1 = @"{'Name':'James'}";
var customer1 = JsonConvert.DeserializeAnonymousType(json1, definition);

Console.WriteLine(customer1.Name);
// James

Тепер це розумно! ;-) Але стає незграбним, коли визначення не таке прямолінійне, як ваш приклад.
Sнаđошƒаӽ

Я нічого не знаю про definitionте, як я повинен використовувати DeserializeAnonymousTypeв цьому випадку?
Мехді Деггані,

Це нікчемний приклад, оскільки більшість JSON ніде не настільки спрощені. Я хотів би побачити визначення, яке більше нагадує рядок JSON із вкладеними властивостями ...
pmfith
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.