2017-02-22 51 views
0

目前,我有一些JSON數據,我試圖使用DataContractJsonSerializer類進行反序列化。但是,數據中的一個數組包含多種類型的對象。有沒有辦法正確地反序列化這些數據?我知道a very similar question exists,但是我不想使用Json.NET或任何其他第三方庫。使用DataContracts反序列化多類型JSON數組

編輯:一個小例子:

在這種情況下,讓我們說,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 S和Bar S'

+0

'但是,在數據陣列的一個包含多種類型objects'的 - 你能提供一個例子嗎?這些對象類型有何不同?如果由於某種原因它們完全不同,那麼可以考慮使用「動態」類型。發佈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 Web API,它在數組中提供2個響應(使用不同的格式)。 – LegionMammal978

+0

在這種情況下,您需要有兩個獨立的模型。對於返回一個數組的第一個API調用,您將反序列化爲「ModelA」。第二個API調用您反序列化爲'ModelB'。 –

+0

我認爲你誤解了我想說的話。我向服務器傳遞一個請求,並通過一個帶有'Foo'和'Bar'的數組接收一個響應。我在這裏問如何反序列化這個數組來檢索其中的'Foo'和'Bar'。 – LegionMammal978