Newtonsoft JSON Deserialize

83

Мой JSON выглядит следующим образом:

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

Я нашел библиотеку десериализации Newtonsoft JSON.NET для C #. Я пытался использовать его следующим образом:

object JsonDe = JsonConvert.DeserializeObject(Json); 

Как я могу получить доступ к JsonDeобъекту, чтобы получить все данные "Тип"? Я пробовал использовать цикл, но он не работает, потому что у объекта нет перечислителя.

abc cba
источник
Вам следует взглянуть на ответ на этот вопрос: stackoverflow.com/questions/11126242/…
Dietz

Ответы:

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);. Общая версия deserialize работает намного лучше, спасибо. :-)
SharpC
Хорошо, я пишу это здесь: dotnet add package Newtonsoft.Jsonи using Newtonsoft.Json;.
дани
83

Более простое решение: использование динамического типа

Начиная с Json.NET 4.0 Release 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;

При использовании dynamic вам не нужно создавать определенный класс для хранения ваших данных.

Ив М.
источник
10
хороший ответ, спасибо за представляя меня dynamic:)
maialithar
2
Это определенно легко. Но у него есть недостаток: он не может легко проверить, существует ли свойство (вы должны использовать обработку исключений).
Jowen 07
2
@Jowen Чтобы проверить, существует ли свойство без обработки исключений, взгляните на эти ответы
Ив М.
большое спасибо 1 !! простейшее решение, которое я так долго
искал
10

В соответствии с документацией 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