Newtonsoft JSON Deserialize

83

Mój JSON wygląda następująco:

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

Znalazłem bibliotekę deserializacji Newtonsoft JSON.NET dla języka C #. Próbowałem go użyć w następujący sposób:

object JsonDe = JsonConvert.DeserializeObject(Json); 

Jak mogę uzyskać dostęp do JsonDeobiektu, aby uzyskać wszystkie dane typu? Próbowałem z pętlą, ale nie działa, ponieważ obiekt nie ma modułu wyliczającego.

abc cba
źródło
Powinieneś rzucić okiem na odpowiedź na to pytanie: stackoverflow.com/questions/11126242/…
Dietz

Odpowiedzi:

133

Możesz zaimplementować klasę, która przechowuje pola, które masz w swoim JSON

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

a następnie użyj ogólnej wersji DeserializeObject:

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

Dokumentacja: serializacja i deserializacja JSON

Michael Banzon
źródło
Właśnie dodałem przykład, który powinien być przydatny. Jest dla mnie tajemnicą, dlaczego „typ” to lista list (tablica tablicowa) - ale powinna być zgodna z podanym przez Ciebie ciągiem json.
Michael Banzon,
1
Bardzo dziękuję za odpowiedź. Pomogło mi to rozwiązać mój problem :)
santosh kumar patro 13.07.15
Używałem odlewu, który się nie udał MyData tmp = (MyData)JsonConvert.DeserializeObject(json);. Ogólna wersja deserializacji działa znacznie lepiej, dzięki. :-)
SharpC
Ok, piszę to tutaj: dotnet add package Newtonsoft.Jsoni using Newtonsoft.Json;.
dani herrera
83

O wiele łatwiejsze rozwiązanie: użycie typu dynamicznego

Począwszy od Json.NET 4.0 Release 1, istnieje natywna obsługa dynamiczna . Nie musisz deklarować klasy, po prostu użyj dynamic:

dynamic jsonDe = JsonConvert.DeserializeObject(json);

Wszystkie pola będą dostępne:

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;

Dzięki dynamice nie musisz tworzyć specjalnej klasy do przechowywania danych.

Yves M.
źródło
10
miła odpowiedź, dzięki za wprowadzenie mnie dynamic:)
maialithar
2
To zdecydowanie łatwe. Ma jednak tę wadę, że nie jest w stanie łatwo sprawdzić, czy właściwość istnieje (należy użyć obsługi wyjątków).
Jowen,
2
@Jowen Aby sprawdzić, czy nieruchomość istnieje bez obsługi wyjątków, spójrz na te odpowiedzi
Yves M.
dziękuję bardzo 1 !! najprostsze rozwiązanie, którego szukałem tak długo
Sly_TheKing
10

Zgodnie z dokumentacją Newtonsoft możesz również deserializować do anonimowego obiektu, takiego jak ten:

var definition = new { Name = "" };

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

Console.WriteLine(customer1.Name);
// James
SomethingOn
źródło
Teraz to sprytne! ;-) Ale robi się niezręcznie, gdy definicja nie jest tak prosta, jak w twoim przykładzie.
Sнаđошƒаӽ
Nie wiem nic o tym definition, jak mam użyć DeserializeAnonymousTypew tym przypadku?
Mehdi Dehghani
To bezwartościowy przykład, ponieważ większość JSON nie jest tak uproszczona. Chciałbym zobaczyć definicję, która bardziej przypomina ciąg JSON z zagnieżdżonymi właściwościami ...
pmf z