首页 > 解决方案 > 运行后将对象从通用类型反序列化为已知类型

问题描述

我正在调用基于布尔“成功”字段返回通用结果的第三方 API。结果是基于结果响应的已知类型类。

我正在用一种非常愚蠢的方式将类反序列化为一种object类型并读取结果。

读取结果后,我将再次将对象序列化为JSON,并将对象反序列化回相应的正确结果/已知数据类型。

我想问的问题是,实现这一目标的有效或更好的方法是什么

来自第三方 API 的示例响应

如果成功是false

    {
        "Success": false,
        "Result": 
        {
            "ErrorCode": "1",
            "ErrorMessage": "Request is unsuccessful."
        }
    }

如果成功是true

    {
        "Success": true,
        "Result": 
        {
            "UserID": "xxxxx",
            "UserName": "yyyyy",
            "UserAge": 60
        }
    }

我的代码

我的调用方法(如何改进这个调用方法???

var request = new RequestModel ("user1", "password1");
var data = await CallThirdPartyAPI(request);
//At this point of time, this `data` is a `Message<object>` data type
if (data.Success)
{
    var passResult = JsonConvert.SerializeObject(data); //Serialize object type back to JSON 
    var passObject = JsonConvert.DeserializeObject<Message<SuccessResponse>>(passResult); //Deserialize object back to known data type
}
else
{
    var failResult = JsonConvert.SerializeObject(data); //Serialize object type back to JSON
    var failObject = JsonConvert.DeserializeObject<Message<FailResponse>>(failResult); //Deserialize object back to known data type
}

API方法

public async Task<Message<object>> CallThirdPartyAPI(RequestModel requestModel)
{
    var requestUrl = CreateRequestUri(string.Format(System.Globalization.CultureInfo.InvariantCulture,
        "api/thirdpartyapi/"));
    var result =  await PostAsync<object, requestModel>(requestUrl, requestModel);
    return result;
}


// Common method for making POST calls
private async Task<Message<T1>> PostAsync<T1, T2>(Uri requestUrl, T2 content)
{                 
    var response = await _httpClient.PostAsync(requestUrl.ToString(), CreateHttpContent<T2>(content));
    response.EnsureSuccessStatusCode();
    var data = await response.Content.ReadAsStringAsync();
    var result =  JsonConvert.DeserializeObject<Message<T1>>(data);
    return result;
}

DTO

public class Message<T>
{
    [DataMember(Name = "Success")]
    public bool Success { get; set; }

    [DataMember(Name = "Result")]
    public T Result { get; set; }
}

public class FailResponse
{
    public string ErrorCode { get; set; }
    public string ErrorMessage { get; set; }
}

public class SuccessResponse
{
    public string UserId{ get; set; }
    public string UserName { get; set; }
    public int UserAge{ get; set; }
}

public class RequestModel
{
 public string UserName { get; set; }
 public string Password { get; set; }
}

标签: c#.netgenericsjson.net

解决方案


推荐阅读