使用多个值反序列化Json

时间:2011-01-27 15:43:55

标签: c# json deserialization

我很难用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&amp; 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数据的去除是新的,所以如果我犯了大错,请原谅我,请帮助我。

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

对于任何有兴趣的人,我都会回答我自己的问题。 Firts,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; }
}

通过这些修改,代码工作正常。 希望它对某人有所帮助。