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
было достаточно, чтобы все заработало.