2017-02-22 8 views
0

В настоящее время у меня есть некоторые данные JSON, которые я пытаюсь десериализовать, используя класс DataContractJsonSerializer. Однако один из массивов данных содержит несколько типов объектов. Есть ли способ десериализации этих данных должным образом? Я знаю, что a very similar question exists, но Я бы предпочел не использовать Json.NET или любые другие сторонние библиотеки.Deserialize многотипный массив JSON с использованием DataContracts

РЕДАКТИРОВАТЬ: Небольшой пример:

В этом случае, скажем, в формате JSON имеет форму [{"foo":string},{"bar":string},{"foo":string},{"foo":string},...], где каждый элемент является либо формы {"foo":string} или {"bar":string}. Затем контракты могут быть установлены в качестве таковых:

[DataContract] 
class Foo { [DataMember] public string foo; } 

[DataContract] 
class Bar { [DataMember] public string bar; } 

В этом контексте, на мой вопрос, как я десериализовать этот массив Foo с и Bar с?

+0

'Тем не менее, один из массивов данных содержит несколько типов objects' - не могли бы вы привести пример? Как различаются эти типы объектов? Если по какой-то причине они совершенно разные, вы можете рассмотреть тип «dynamic». Проведение образца JSON и модели, которую вы пытаетесь десериализовать, было бы полезно. –

+0

@ShaneRay Добавлен небольшой пример, в реальном случае мои 'Foo' и' Bar' имеют совершенно разные свойства. – LegionMammal978

ответ

0

Это звучит не так. В одном массиве не должно быть двух совершенно разных типов. Учитывая JSON условия, что я хотел бы попробовать что-то вроде этого ....

[DataContract] 
class SomeClass 
{ 
    [DataMember] 
    public string foo { get; set;} 
    [DataMember] 
    public string bar { get; set;} 
} 

Затем проверить для IsNullOrWhiteSpace() на каждое свойстве.

Обновленный с большим количеством кода ...

static void Main(string[] args) 
    { 
     SomeClass[] output; 
     var json = "[{\"foo\":\"value\"},{\"bar\":\"value\"},{\"foo\":\"value1\"},{\"foo\":\"value1\"}]"; 

     using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
     { 
      var deserializer = new DataContractJsonSerializer(typeof(SomeClass[])); 
      output = (SomeClass[])deserializer.ReadObject(ms); 
     } 

     // do something with output 
     Console.WriteLine(output.Length); 
    } 
+0

В частности, я обращаюсь к определенному веб-интерфейсу JSON, который дает 2 ответа (в разных форматах) в массиве. – LegionMammal978

+0

В этом случае вам необходимо иметь две отдельные модели. Для первого вызова API, который возвращает массив, вы десериализовываете его в 'ModelA'. Второй API вызывает десериализацию в 'ModelB'. –

+0

Я думаю, вы не понимаете, что я пытаюсь сказать. Я передаю один запрос серверу и получаю один ответ с массивом с 'Foo' и' Bar'. Я спрашиваю здесь, как десериализовать этот массив, чтобы получить в нем 'Foo' и' Bar'. – LegionMammal978