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.

questionAnswers(2)

yourAnswerToTheQuestion