Próbuję deserializować niektóre dane JSON do obiektów dla aplikacji. Do tej pory wszystko było w porządku, ponieważ właściwości danych JSON były statyczne (klucz z wartością). Teraz mam wynik, w którym klucz jest dynamicznym kawałkiem danych.Deserializowanie JSON przy użyciu JSon.NET z dynamicznymi danymi
Oto przykład JSON URL:
http://en.wikipedia.org/w/api.php?action=query&format=json&pageids=6695&prop=info
Powstały JSON na to:
{ "query" : { "pages" : { "6695" : { "counter" : "",
"lastrevid" : 468683764,
"length" : 8899,
"ns" : 0,
"pageid" : 6695,
"title" : "Citadel",
"touched" : "2012-01-03T19:16:16Z"
} } } }
Okay, to świetnie, z wyjątkiem nie mogę deserializować "stron" danych do obiekt. Gdybym miał określić klasę dla stron musiałaby wyglądać następująco:
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; }
}
W celu deserialze zawartość (używając JsonConvert.Deserialize (jsondata)) i wszyscy wiemy, że nie możemy mieć klasa o nazwie 6695. Nie tylko to, nazwa klasy musiałaby być inna (na przykład pageid = 7145 musiałaby być klasa 7145).
Mogę pozbyć się niektórych wartości, jeśli używam czegoś takiego jak JObject.Parse (zawartość), a następnie dostęp do elementów jako JArrays, ale jest to dość brzydkie i wciąż utknąłem na próbach wydobycia danych z tablicy stron .
Poszukuję kogoś, kto może w tym pomóc. Nie wydaje mi się, żeby było to rzadkie, to po prostu nie dane JSON, z którymi miałem do czynienia, i nie wiem, jak sobie z tym poradzić.
Dzięki!
PS zapomniałem wspomnieć, że jest to na Windows Phone 7, więc "dynamiczny" nie jest dostępny!
Czy nie 6695, po prostu być nazwa właściwości, a nie nazwa klasy? Wciąż problem, ale może możesz wyszukać i zamienić właściwość liczbową na pewną stałą nazwę. Nie jestem pewien, w jaki sposób Json.NET radzi sobie z tym, ale może możesz spróbować deserializować go jako słownik określonego typu obiektu? –
Prawdopodobnie trochę spóźniłem się na to przyjęcie, ale lib newtonsoft ma JObject dla tego ... var obj = JObject.Parse (jsonString); zasadniczo traktuje dane jak złożony zagnieżdżony słownik podobny do zachowań javascript w przeglądarce. Otrzymasz z powrotem instancję "JObject", która pozwala ci uzyskać dostęp do wszystkiego za pomocą składni tablic np .: var page = obj ["pages"] ["6695"] – War