Deserialization RestSharp с массивом JSON

У меня есть ответ JSON, который я пытаюсь десериализовать с помощью RestSharp, и он выглядит так:

{"devices":[{"device":{"id":7,"deviceid":"abc123","name":"Name"}},
            {"device":{"id":1,"deviceid":"def456","name":"Name"}}],
 "total":2,
 "start":0,
 "count":2}

Основываясь на некоторых предложениях, которые я нашел, я попытался настроить свой POCO следующим образом:

public class DevicesList
{
    public List<DeviceContainer> Devices;
}

public class DeviceContainer
{
    public Device Device;
}

public class Device
{
    public int Id { get; set; }
    public string DeviceId { get; set; }
    public string Name { get; set; }
}

И тогда мое выполнение выглядит следующим образом:

// execute the request
var response = client.Execute<DevicesList>(request);

Тем не менее, response.Data является NULL, и я пробовал другие варианты без везения.

Итак, какую структуру классов и картографию следует использовать для этой ситуации? Я также пробовал это без дополнительного класса DeviceContainer.

Спасибо за помощь.

Ответ 1

RestSharp работает только с свойствами, он не десериализуется в полях, поэтому не забудьте преобразовать поля Devices и Device в свойства.

Кроме того, дважды проверьте Content-Type ответа, если ответы являются нестандартными, RestSharp вообще не может использовать JsonDeserializer. См. Мой ответ на Клиент RestSharp возвращает все свойства как null при десериализации ответа JSON

Ответ 2

У меня была немного другая проблема, когда моя десериализация POCO содержала массив.

Изменение его с Devices[] на List<Devices> разрешило проблему и было правильно десериализовано.

Ответ 3

Что-то, с чем я столкнулся, это не работает, если ваши интерфейсы, такие как IEnumerable или IList, должны быть конкретным.

Это не сработает, как и для некоторых других сериализаторов json, таких как json.net.

public class DevicesList
{
    public IEnumerable<DeviceContainer> Devices { get; set; }
}

public class DeviceContainer
{
   ...
}

это должно быть примерно так:

public class DevicesList
{
    public List<DeviceContainer> Devices { get; set; }
}

public class DeviceContainer
{
   ...
}

Ответ 4

RestShartp не поддерживает DataAnnotation/DataMember, переименуйте свои свойства без maj:

  • Устройства → устройства
  • Устройство → устройство

И не забывайте {get; set;};).

Ответ 5

Моя проблема была совершенно другой, я наивно думал, что JsonDeserializer поддерживает атрибут JsonProperty, но это не так. Поэтому при попытке десериализации в

public class AvailableUserDatasApi
{
    [JsonProperty("available-user-data")]
    public List<AvailableUserDataApi> AvailableUserDatas { get; set; }
}

это не удалось.. Но изменения AvailableUserDatas на AvailableUserData было достаточно, чтобы все заработало.