我正在开发一个需要调用已提供给我们的第三方API的程序。我们使用Newtonsoft.Json来序列化/反序列化对象。
我想创建一个通用的“基础”对象,因为通过查看API,所有调用都有一些常见数据(例如错误代码,错误消息),然后有相关数据。我一直在尝试这样的事情:
来自API的JSON响应
{
"addressInfo": {
"checksum": "317841",
"homeGeoCode": "",
"homeAddress": {
"addressLine1": "123 MAIN STREET",
"addressLine2": "",
"city": "NEW YORK",
"county": "BRONX",
"stateAbbr": "NY",
"zipCode": "10013",
"zipSuffix": ""
},
"w2Address": {
"addressLine1": "",
"addressLine2": "",
"city": "",
"stateAbbr": "",
"zipCode": ""
},
"altAddress": {
"addressLine1": "",
"addressLine2": "",
"city": "",
"stateAbbr": "",
"zipCode": "0"
}
},
"errorCode": "0",
"errorMessage": ""
}
现在,由于不同的API方法会有很多这样的调用,errorCode
和errorMessage
对所有API方法都是通用的,所以我想创建一个通用的“根”对象,可能是任何类型的,因此API中的每个“响应”类都有一个基类型。如下所示:
通用响应对象
public abstract class ApiResponse<T>
{
public string ErrorCode { get; set; }
public string ErrorMessage { get; set; }
public T Data { get; set; }
}
因此,对于此示例,请求可能如下所示:
反序列化响应
var response = JsonConvert.DeserializeObject<ApiResponse<AddressInfo>>(jsonString);
其中AddressInfo类具有JSON中定义的子类和属性(例如HomeAddress,W2Address,Checksum等)。
但是,这似乎不正常,因为JSON.NET不知道在这种情况下“Data”对应于JSON字符串的addressInfo
部分,即使{{1}的类型设置为T
。
有没有办法获得此功能,或者我应该只使AddressInfo
类非泛型并确保子类需要提供具有正确名称的相应数据类型(例如AddressInfo),例如:
假设派生类
ApiResponse
这似乎是更简单的方法,但也意味着我们特别需要针对每种类型的请求的Response类,这会增加复杂性,而如果通用响应可以工作,我们可以使用它并将类型设置为每个数据从API映射而没有每个包装类的类。