2017-02-22 53 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