Десериализация иерархии объектов JSON в иерархию словаря <строка, объект>
Я в.NET для WinRT (C #) и я хотел бы десериализовать строку JSON вDictionary<string, object>
где значение словаря может быть позже преобразовано в фактический тип. Строка JSON может содержать иерархию объектов, и я хотел бы иметь дочерние объекты вDictionary<string, object>
также.
Вот пример JSON, который он должен уметь обрабатывать:
{
"Name":"John Smith",
"Age":42,
"Parent":
{
"Name":"Brian Smith",
"Age":65,
"Parent":
{
"Name":"James Smith",
"Age":87,
}
}
}
Я пробовал сDataContractJsonSerializer делать так:
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);
}
Это на самом деле хорошо работает для первого уровня, но потом«Родитель» это просто объект, который не может быть приведен кDictionary<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>'
Затем я попытался с помощьюJson.NET но дочерние объекты являютсяIDictionary<string, JToken>
, что заставляет меня перебирать всю иерархию и преобразовывать их снова.
Кто-нибудь знает, как решить эту проблему, используя существующий сериализатор?
РЕДАКТИРОВАТЬ
я используюDictionary<string, object>
потому что мои объекты меняются от одного вызова сервера к другому (например,"Я бы" собственность может быть"Я бы", * "cust_id" * или"Пользовательский ИД" в зависимости от запроса), и поскольку мое приложение не единственное, использующее эти сервисы, я не могу это изменить, по крайней мере сейчас.
Поэтому мне было неудобно пользоватьсяDataContractAttribute а такжеDataMemberAttribute в этой ситуации. Вместо этого я хотел бы хранить все в универсальном словаре и иметь одно строго типизированное свойство «Id», которое ищет в словаре «id», «cust_id» или «customerId», делая его прозрачным для пользовательского интерфейса.
Эта система прекрасно работает с JSON.NET, однако, если сервер возвращает иерархию объектов, подобъекты будут храниться в моем словаре как JObjects вместо другого словаря.
Подводя итог, я ищу эффективную систему для преобразования иерархии объектов в иерархиюDictionary<string, object>
используя сериализатор JSON, доступный в WinRT.