Десериализация Json с несколькими значениями - PullRequest
1 голос
/ 27 января 2011

Я с трудом пытаюсь десериализовать следующие данные Json с помощью C #:

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

Чтобы сделать это немного более понятным, я создал XML-версию того же Json только дляцель визуализации:

<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, поэтому, пожалуйста, прости меня, если я сделал огромныйошибки, пожалуйста, помогите мне с этим.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 27 января 2011

Похоже, что в вашем JSON элемент документа первой подпапки - это не массив, а одна строка. Вместо document:'OneDocument' должно быть document:['OneDocument'].

0 голосов
/ 27 января 2011

Для всех, кто заинтересован, я отвечу на свой вопрос.Во-первых, Рекс М был прав, мне нужно было включить каждый документ в массив, даже если он только один.И в массиве 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; }
}

С этими модификациями код работает нормально.Надеюсь, это кому-нибудь поможет.

...