1

我很难用 C# 反序列化以下 Json 数据:

{folder:{name:'MainFolder',subfolder:[{name:'OneFolder',document:'OneDocument'},{name:'TwoFolder',document:['TwoDocumentA','TwoDocumentB']}]}}

为了更清楚一点,我创建了同一个 Json 的 XML 版本,只是为了可视化:

<folder name="MainFolder">
<subfolder name="OneFolder">
    <document>OneDocument</document>
</subfolder>
<subfolder name="TwoFolder">
    <document>TwoDocumentA</document>
    <document>TwoDocumentB</document>
</subfolder></folder>

所以,我想我的问题是我有两种类型的文档:A 和 B 作为子文件夹的子文件夹。这是我的代码以及我的尝试方式,但这不起作用(C#):

[Serializable, DataContract(Name = "folder")]
internal class Folder
{
    private string _name;
    private SubFolder[] _subFolder;

    [DataMember(Name = "name")]
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    [DataMember(Name = "subfolder")]
    public SubFolder[] SubFolder
    {
        get { return _subFolder; }
        set { _subFolder = value; }
    }

}

internal class SubFolder
{
    private string _name;
    private string[] _document;

    [DataMember(Name = "name")]
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

    [DataMember(Name = "document")]
    public string[] Document
    {
        get { return _document; }
        set { _document = value; }
    }
}

我是 Json 数据解封的新手,所以如果我犯了很大的错误,请原谅我,请帮助我。

提前致谢。

4

2 回答 2

1

看起来在您的 JSON 中,第一个子文件夹的文档成员不是数组,而是单个字符串。而不是document:'OneDocument',它应该是document:['OneDocument']

于 2011-01-27T15:46:45.227 回答
0

对于任何有兴趣的人,我会回答我自己的问题。首先,Rex M 是对的,我需要将每个文档包含在一个数组中,即使它只有一个。Json 数组上有一些无用的数据,所以这就是我无法使用我正在使用的类层次结构反序列化它的原因。正确的 Json 将是这个:

{"name":"MainFolder","subfolder":[{"name":"OneFolder","document":["OneDocument"]},{"name":"TwoFolder","document":["TwoDocumentA","TwoDocumentB"]}]}

其次,我在类上遗漏了一些必要的标签:

[DataContract]
internal class Folder
{
    [DataMember(Name = "name")]
    public string Name { get; set; }

    [DataMemberAttribute(Name = "subfolder")]
    public List<SubFolder> SubFolder { get; set; }
}

[DataContractAttribute(Name = "subfolder")]
internal class SubFolder
{
    [DataMember(Name = "name")]
    public string Name { get; set; }

    [DataMember(Name = "document")]
    public List<string> Document { get; set; }
}

通过此修改,代码可以正常工作。希望它可以帮助某人。

于 2011-01-27T18:57:24.517 回答