c# - 运行后将对象从通用类型反序列化为已知类型
问题描述
我正在调用基于布尔“成功”字段返回通用结果的第三方 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; }
}
解决方案
推荐阅读
- php - 创建新数组仅用于从表中打印选中的行
- reactjs - 如何在服务器 SSR 上渲染的 Create React App 中添加对 Css 模块和 Sass 的支持
- c# - Ghostscript.NET.Rasterizer 设置分辨率 (Dpi) 不起作用
- opendaylight - 如何使用 yang-version 1.1 模块的 ODL Yangtools maven 插件生成代码
- python - Python中的华氏到摄氏
- pandas - 值频率作为分组后的列
- python - 如何保存在python上创建的文件?
- angular - 如何使用 Angular 8 访问其他组件的变量
- python - 如何将两列的平均值分组在另一列-熊猫下
- raspberry-pi - 让子 gmail 帐户在 Chromium 上工作