1

次の Json データを C# で逆シリアル化するのに苦労しています。

{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 の 2 種類のドキュメントがあることだと思います。これが私のコードと私が試した方法ですが、これは機能しません(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 は正しかったです。配列に各ドキュメントを含める必要がありました。たとえそれが 1 つだけであってもです。また、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 に答える