Deserializacja hierarchii obiektów JSON do hierarchii Dictionary <string, object>
Jestem w.NET dla WinRT (C #) i chciałbym deserializować łańcuch JSON do aDictionary<string, object>
, gdzie wartość słownika może być później przekształcona na typ rzeczywisty. Łańcuch JSON może zawierać hierarchię obiektów i chciałbym mieć obiekty podrzędne wDictionary<string, object>
także.
Oto przykładowy JSON, który powinien być w stanie obsłużyć:
{
"Name":"John Smith",
"Age":42,
"Parent":
{
"Name":"Brian Smith",
"Age":65,
"Parent":
{
"Name":"James Smith",
"Age":87,
}
}
}
Próbowałem zDataContractJsonSerializer robiąc tak:
using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
DataContractJsonSerializerSettings settings = new DataContractJsonSerializerSettings();
settings.UseSimpleDictionaryFormat = true;
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Dictionary<string, object>), settings);
Dictionary<string, object> results = (Dictionary<string, object>)serializer.ReadObject(ms);
}
To działa dobrze dla pierwszego poziomu, ale potem"Rodzic" jest tylko obiektem, który nie może zostać rzucony na aDictionary<string, object>
:
Dictionary<string, object> parent = (Dictionary<string, object>)results["Parent"];
Cannot cast 'results["Parent"]' (which has an actual type of 'object') to 'System.Collections.Generic.Dictionary<string,object>'
Potem spróbowałem użyćJson.NET ale obiektami potomnymi są same JObjectIDictionary<string, JToken>
, co zmusza mnie do powtarzania całej hierarchii i konwertowania ich ponownie.
Czy ktoś wie, jak rozwiązać ten problem za pomocą istniejącego serializatora?
EDYTOWAĆ
używamDictionary<string, object>
ponieważ moje obiekty różnią się w zależności od wywołania serwera na inny (np"ID" nieruchomość może być"ID", * "cust_id" * lub"Identyfikator klienta" w zależności od żądania), a ponieważ moja aplikacja nie jest jedyną aplikacją korzystającą z tych usług, nie mogę tego zmienić, przynajmniej na razie.
Dlatego uznałem to za niewygodne w użyciuDataContractAttribute iDataMemberAttribute w tej sytuacji. Zamiast tego chciałbym przechowywać wszystko w ogólnym słowniku i mieć jedną silnie wpisaną właściwość „Id”, która szuka „id”, „cust_id” lub „customerId” w słowniku, czyniąc go przezroczystym dla interfejsu użytkownika.
Ten system działa doskonale z JSON.NET, jednak jeśli kiedykolwiek serwer zwróci hierarchię obiektów, podobiekty będą przechowywane jako obiekty JObject w moim słowniku zamiast w innym słowniku.
Podsumowując, szukam wydajnego systemu do przekształcenia hierarchii obiektów w hierarchięDictionary<string, object>
przy użyciu serializatora JSON dostępnego w WinRT.