【问题标题】:Deserialize multi-type JSON array using DataContracts使用 DataContracts 反序列化多类型 JSON 数组
【发布时间】:2017-02-22 16:11:34
【问题描述】:

目前,我有一些 JSON 数据正在尝试使用 DataContractJsonSerializer 类进行反序列化。但是,数据中的一个数组包含多种类型的对象。有没有办法正确反序列化这些数据?我知道a very similar question exists,但我不希望使用 Json.NET 或任何其他第三方库。

编辑:一个小例子:

在本例中,假设 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; }

在这种情况下,我的问题是,如何反序列化 Foos 和 Bars 的数组?

【问题讨论】:

  • However, one of the arrays in the data contains multiple types of objects -- 你能举个例子吗?这些对象类型有何不同?如果由于某种原因它们完全不同,您可以考虑dynamic 类型。发布 JSON 样本和您尝试将其反序列化为的模型会很有帮助。
  • @ShaneRay 加了一个小例子,我的FooBar的属性完全不同。

标签: c# json-deserialization datacontractjsonserializer


【解决方案1】:

这听起来不对。单个数组中不应有两种完全不同的类型。鉴于提供的 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);
    }

【讨论】:

  • 具体来说,我正在查询某个 JSON Web API,它在一个数组中给出 2 个响应(不同格式)。
  • 在这种情况下,您需要有两个独立的模型。对于第一个返回数组的 API 调用,您将反序列化为 ModelA。您反序列化为 ModelB 的第二个 API 调用。
  • 我认为您误解了我要说的内容。我将一个请求传递给服务器,并收到一个带有FooBar 数组的响应。我在这里问如何反序列化这个数组以检索其中的FooBar
  • 您提供的 JSON 是一个对象数组...听起来您可能指的是字典,但 foo 重复,因此它不能成为索引器。我已经用更多示例代码更新了我的答案。
  • 我会的,只是等待一两天以确保没有更好的答案出现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
相关资源
最近更新 更多