经过数小时的尝试和研究,我请求您的帮助。
我正在调用一个公共的API,它返回的结构与返回的数据相同。
例如,检索站点和地区的REST调用返回这两个JSON答案:
车站响应:
"response" : {
"status": { "@attributes": {"code": "0", "message": "OK"} },
"data" : {
"station": [{
"number": "stationId",
"name": "stationName",
"address": "stationAddress",
"state": "1",
"latitude": "stationLat",
"longitude": "stationLong",
"slotsavailable": "10",
"bikesavailable": "20",
"pos": "0",
"district": "stationDistrict",
"lastupdate": "2016-03-28T11:47:08+02:00"
}, {...}, ...]}
}
地区回应:
"response" : {
"status": { "@attributes": {"code": "0", "message": "OK"} },
"data" : { "district": [{"id": "districtId", "name": "districtName"}, {...}, ...] }
}
我使用的是带有Newtonsoft.Json的.NET 4.5/C#解决方案来执行调用。我想使映射到客户端响应的对象具有通用性,因此调用的执行将如下所示:
var result = await client.Execute<Response<ApiResponseDistrict>>(request);
var result = await client.Execute<Response<ApiResponseStation>>(request);
我的第一次尝试是进行一个非泛型调用(通过返回的数据创建一个完整的对象),这是成功的。
我的第二次尝试是创建一个通用对象,因此我使用Newtonsoft:库的JsonProperty
创建了以下类
public class ApiResponse<T>
{
[JsonProperty("response")]
public Response<T> Response { get; set; }
}
public class Response<T>
{
[JsonProperty("status")]
public Status Status { get; set; }
[JsonProperty("data")]
public Data<T> Data { get; set; }
}
public class Data<T>
{
public T ResponseData { get; set; }
}
public class ApiResponseDistrict
{
[JsonProperty("district")]
public List<District> Districts { get; set; }
}
public class District
{
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
}
在这一点上,当我执行调用时,对象Response和它的属性Status都被赋值为waited,但属性Data从未被赋值(null)。
我的第三次尝试是继续第二次尝试,但使用了Newtonsoft库的JsonObject
(结果相同):
[JsonObject("district")]
public class ApiResponseDistrict
{
public List<District> Districts { get; set; }
}
由于我是Newtonsoft的新手,我想知道是否可以像我尝试的那样使用泛型类来映射调用返回的对象,或者我必须为每个返回的"数据"创建一个完整的对象?
谢谢你的回答和解释或线索,让我找到答案!
public class Response<T>
{
[JsonProperty("status")]
public Status Status { get; set; }
[JsonProperty("data")]
public Data<T> Data { get; set; }
}
public class Data<T>
{
public T ResponseData { get; set; }
}
这在数据之间添加了另一层,因此响应看起来像这样:
{
"Status": …,
"Data": {
"ResponseData": {
<The actual type T>
}
}
}
相反,您希望删除ResponseData
级别:
public class Response<T>
{
[JsonProperty("status")]
public Status Status { get; set; }
[JsonProperty("data")]
public T Data { get; set; }
}
例如,对于上面的JSON,您将有一个StationResponseData
类:
public class StationResponseData
{
public List<Station> Stations
{ get; set; }
}
然后将JSON反序列化为Response<StationResponseData>
。Station
类将包含number
、name
、address
等的属性。