JSON反序列化嵌套方括号

3
我使用DataContractJsonSerializer来反序列化Dropbox Core API的/delta响应。响应如下:
{
  "entries": [
    [
      "/foo.dbf", 
      {
        "bytes": 226822, 
        "client_mtime": "Thu, 26 Sep 2013 23:21:50 +0000", 
        ...
      }
    ], 
    [
      "bar.dbf", 
      {
        "bytes": 147, 
        "client_mtime": "Thu, 26 Sep 2013 23:21:49 +0000", 
        ...
      }
    ],
    ...
  ] 
}

我认为问题在于嵌套的方括号。最内层的方括号包含一个由字符串和对象组成的数组。我不确定如何在我的C#类中表示它。

我尝试将“entries”表示为:

[DataContract]
public class Delta
{    
    [DataMember(Name="entries")]
    public DeltaInfo[] Entries { get; internal set; }
}

“DeltaInfo”可以理解为:

[DataContract]
public class DeltaInfo
{
    [DataMember]
    public string Path { get; internal set; }

    [DataMember]
    public PathInfo MetaData { get; internal set; }
}

尽管我在Entries数组中得到了预期数量的DeltaInfo对象,但是所有DeltaInfo对象中的Path和MetaData都为null。

我认为我的问题在于“entries”实际上并不包含DeltaInfo对象的数组,而是包含一个包含路径和元数据的数组的数组,我不确定如何在我的代码中表示它。

2个回答

2

一个开放方括号 '[' 表示列表的开始。两个开放方括号应对应于列表的列表。结构如下。

[DataContract]
public class Delta
{
    [DataMember(Name="entries")]
    public List<List<DeltaInfo>> entries { get; set; }
}

[DataContract]
public class DeltaInfo
{
    [DataMember]
    public string Path { get; internal set; }

    [DataMember]
    public PathInfo MetaData { get; internal set; }
 }

不幸的是,这对我没有用。我最终得到的是内部列表,其中有两个DeltaInfo项,它们的属性都为null。这意味着反序列化程序同时看到了字符串和PathInfo,但无法成功将它们反序列化为DeltaInfo。你之前提出的List<List<object>>似乎是正确的方法,但尝试将其反序列化为对象会引发异常。 - user3681364

0

我找到了解决方案。问题不在于嵌套数组,而是最内层的数组包含多个类型。最终,我使用System.Web.Script.Serialization.JavaScriptSerializer将json反序列化为字典,并自己构造对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接