Как десериализовать массив JSON с «корневым» элементом для каждого объекта в массиве, используя Json.NET? - PullRequest
6 голосов
/ 06 января 2012

У меня есть следующая строка JSON:

[
  { "Person" : { "Name" : "John", "Gender" : "male" } },
  { "Person" : { "Name" : "John", "Gender" : "male" } }
]

(Как вы можете заметить, к сожалению, у меня есть своего рода «корневой» элемент для каждого объекта в массиве. Без этого «корневого» элемента задача становится довольно тривиальной.)

Я должен десериализовать его в список Person класса:

class Person {
    public string Name { get; set; }
    public string Gender { get; set; }
}
...
List<Person> ListPersons() {
    return JsonConvert.DeserializeObject<List<Person>>(jsonString);
}

Можно ли сделать с Json.NET без создания класса-оболочки, такого как PersonResult?

class PersonResult {
    public Person Person { get; set; }
}
...
List<Person> ListPersons() {
    return JsonConvert.DeserializeObject<List<PersonResult>>(jsonString)
                      .Select(p => p.Person)
                      .ToList();
}

Идеальное решение для меня - это возможность как-то явно указать этот «корень» (например, через атрибут) и не создавать никаких оболочек, помощников и т. Д.

1 Ответ

4 голосов
/ 06 января 2012

К сожалению, вы мало что можете сделать с этим вопросом. Так выглядит формат JSON, и нет пути к этому. В результате Json.Net «видит» вашу строку как более или менее:

массив объектов со свойством Person, который является другим объектом со свойствами Name и Gender

Возможно, вы можете поиграть в нее с помощью пользовательского ContractResolvers , чтобы заставить сериализатор работать по-другому ... но это совсем немного. Класс Wrapper, как вы предложили, - это то, как решаются эти проблемы, и я предлагаю придерживаться его.

...