Подтвердить что ты не робот

Удаление десериализации массива JSON в строго типизированный объект .NET

Когда я могу вызвать стороннюю api и вернуть данные из одного класса, все десериализуется с использованием этого кода

TheUser me = jsonSerializer.Deserialize(response, typeof(TheUser)) as TheUser

Проблема возникает, когда я пытаюсь и десериализую содержимое ответа JSON, которое является массивом, например

{
   "data": [
      {
         "name": "A Jones",
         "id": "500015763"
      },
      {
         "name": "B Smith",
         "id": "504986213"
      },
      {
         "name": "C Brown",
         "id": "509034361"
      }
   ]
}

Я могу заставить сериализацию работать только в том случае, если я использую собственный класс упаковки вокруг члена "data", и этот член должен иметь тип List<object>. Если он имеет тип List<TheUser>, я получаю ArgumentException из метода JsonParser DesializeType.

Я изначально попытался сериализоваться без типа обертки, подобного этому

List<TheUser> freinds = jsonSerializer.Deserialize(response, typeof(List<TheUser>)) as List<TheUser>;

но это просто возвращает мне пустую коллекцию. Разумеется, я должен иметь десериализацию массива в строго типизированный список.

4b9b3361

Ответ 1

Afer ищет источник, для WP7 Hammock фактически не использует Json.Net для разбора JSON. Вместо этого он использует собственный парсер, который не очень хорошо справляется с пользовательскими типами.

При использовании Json.Net непосредственно можно десериализовать строго типизированную коллекцию внутри объекта-оболочки.

var response = @"
    {
        ""data"": [
            {
                ""name"": ""A Jones"",
                ""id"": ""500015763""
            },
            {
                ""name"": ""B Smith"",
                ""id"": ""504986213""
            },
            {
                ""name"": ""C Brown"",
                ""id"": ""509034361""
            }
        ]
    }
";

var des = (MyClass)Newtonsoft.Json.JsonConvert.DeserializeObject(response, typeof(MyClass));

return des.data.Count.ToString();

и с:

public class MyClass
{
    public List<User> data { get; set; }
}

public class User
{
    public string name { get; set; }
    public string id { get; set; }
}

Необходимость создания дополнительного объекта с использованием свойства data раздражает, но это следствие того, как построен форматированный объект JSON.

Документация: Сериализация и десериализация JSON

Ответ 2

попробовать

List<TheUser> friends = jsonSerializer.Deserialize<List<TheUser>>(response);

Ответ 3

Это решение, похоже, работает на меня и оборачивается тем, что нужно закодировать кучу классов с "данными" в них.

public interface IDataResponse<T> where T : class
{
    List<T> Data { get; set; }
}

public class DataResponse<T> : IDataResponse<T> where T : class
{
   [JsonProperty("data")]
   public List<T> Data { get; set; }
}

Я должен был включить это для начала, вот пример метода с использованием вышеперечисленного:

public List<TheUser> GetUser()
{
    var results = GetUserJson();
    var userList = JsonConvert.DeserializeObject<DataResponse<TheUser>>(results.ToString());

    return userList.Data.ToList();
} 

Ответ 4

Это работало для меня для десериализации JSON в массив объектов:

List<TheUser> friends = JsonConvert.DeserializeObject<List<TheUser>>(response);

Ответ 6

Пат, структура json очень хорошо знакома с проблемой, о которой я описал here. Ответ для меня заключался в том, чтобы рассматривать представление json как словарь < TKey, TValue > , хотя было всего 1 вход.

Если я прав, ваш ключ имеет строку типа и значение List <T> где T представляет класс "TheUser"

НТН

PS - если вы хотите, чтобы лучше провести сериализацию с помощью Silverlight Serializer, вам нужно будет создать версию WP7, Я написал сообщение в блоге о this

Ответ 7

Я подозреваю, что проблема заключается в том, что json представляет объект со списком пользователей как свойство. Попробуйте десериализовать что-то вроде:

public class UsersResponse
{
    public List<User> Data { get; set; }
}