2015-05-21 3 views
0

Я создал класс под названием RESTObjectBase. Этот класс унаследован любым количеством других классов, которые включают информацию, такую ​​как люди, адрес, номера телефонов.Deserializing complex JSON содержит массив унаследованных типов объектов

Я создаю объект List<RestObjectBase>, содержащий один или несколько объектов этого типа и передающий его обратно на передний конец через вызов REST.

JSON, который является возвращение следующим образом:

{ 
    "Items":[ 
     { 
     "__type":"AnyObjectInheritedFromBaseClass", 
     "ObjectType":3, 
     "First_Name":"", 
     "Last_Name":"", 
     } 
    ], 
    "Status":0 
} 

Я пытаюсь десериализации это на другом конце. У меня было несколько ошибок, в том числе «тип не может быть пустым», но это не моя проблема.

Есть ли способ десериализации объекта этой сложности в исходный класс/список. Почему я боюсь, это массив объектов, которые в конечном счете наследуют RESTObjectBase, и это не похоже на то, что десериализация достаточно умна для этого.

десериализация этого интерфейса может быть любым устройством или платформой, поэтому я не могу просто использовать что-то вроде JSON.NET, поскольку оно не поддерживается везде.

Я был бы рад разоблачить JSON и сериализовать каждый элемент в массиве отдельно, но я не могу понять, как это сделать. Я мог бы использовать этот тип, чтобы определить, как его десериализировать.

Любая помощь будет оценена по достоинству.

+0

Какой сериализатор вы используете? Наличие параметра «__type» предполагает, что это либо «DataContractJsonSerializer», либо «JavaScriptSerializer». – dbc

+0

Проверьте функцию «Вставить JSON как классы» в VS. http://blogs.msdn.com/b/webdev/archive/2012/12/18/paste-json-as-classes-in-asp-net-and-web-tools-2012-2-rc.aspx – Jeremy

+0

Благодарю. Оба они вернули меня на правильный путь. Это и 2 часа сна :). –

ответ

0

Все дело в использовании правильного сериализатора. Я сериализовался с помощью DataContractJsonSerializer, поэтому сделал то же самое с десериализацией, и он работал, как ожидалось.

 RESTResponse rr2 = null; 

     using (MemoryStream ms = new MemoryStream()) 
     { 
      var writer = new StreamWriter(ms); 
      writer.Write(textBox1.Text); 
      writer.Flush(); 
      ms.Position = 0; 

      DataContractJsonSerializer s = new DataContractJsonSerializer(typeof(RESTResponse)); 

      rr2 = (RESTResponse)s.ReadObject(ms); 
     } 

Хотя я планирую это делаю на различных платформах на мобильных устройствах, я планирую использовать Xamarin поэтому я должен быть в состоянии сделать тот же код.

Это также означает, что я мог бы использовать JSON.NET.

Смежные вопросы