为JSON.NET创建通用根对象?

时间:2017-10-18 13:17:30

标签: c# json.net

我正在开发一个需要调用已提供给我们的第三方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方法会有很多这样的调用,errorCodeerrorMessage对所有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映射而没有每个包装类的类。

0 个答案:

没有答案