【问题标题】:Deserialize Json with multiple values反序列化具有多个值的 Json
【发布时间】:2011-01-27 15:43:54
【问题描述】:

我很难用 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数据解封的新手,如果我犯了很大的错误,请原谅我,请帮助我。

提前致谢。

【问题讨论】:

    标签: c# json deserialization


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-17
        • 2021-02-11
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 2021-06-15
        • 2011-10-29
        • 1970-01-01
        相关资源
        最近更新 更多