c# - 如何处理可能是同一调用的对象数组、objectA 或 objectB 的 JSON 输出
问题描述
首先,我是一个爱好编码的人,所以你的答案越长越详细,我就会越快理解。提前感谢您的耐心等待。
我正在做的项目是构建一个客户端类来与 BitMEX 的 REST API ( https://testnet.bitmex.com/api/explorer/#/Order ) 对话。
我试图从 BitMEX 网站上的 swagger 规范生成 c# 代码,但我没有成功地让它工作,即使在解决了一些错误之后。不幸的是,我没有找到很多关于它生成的代码的文档,但这是另一个讨论。:)
我在这里遇到一种情况,一个类应该反序列化一个可以产生 3 种结果的 JSON 调用。我可以有一个 OrderResponse 数组、一个 OrderResponse 或一个 OrderError。处理这种情况的最佳方法是什么?进行所有转换的最佳位置是什么?
到目前为止,我拥有的 Orders 类如下所示:
namespace BitMEX.JSONClass.Order
{
public partial class OrderError
{
[JsonProperty("error")]
public Error Error { get; set; }
}
public partial class Error
{
[JsonProperty("message", NullValueHandling = NullValueHandling.Ignore)]
public string Message { get; set; }
[JsonProperty("name", NullValueHandling = NullValueHandling.Ignore)]
public string Name { get; set; }
}
public partial class OrderResponse
{
[JsonProperty("orderID", NullValueHandling = NullValueHandling.Ignore)]
public Guid? OrderId { get; set; }
[JsonProperty("clOrdID")]
public string ClOrdId { get; set; }
... [code omitted for readability...]
}
public partial class OrderError
{
public static OrderError FromJson(string json)
{
return JsonConvert.DeserializeObject<OrderError>(json, BitMEX.JSONClass.Order.Converter.Settings);
}
}
public partial class OrderResponse
{
public static OrderResponse FromJson(string json)
{
return JsonConvert.DeserializeObject<OrderResponse>(json, BitMEX.JSONClass.Order.Converter.Settings);
}
}
public partial class OrdersResponse
{
public static List<OrderResponse> FromJson(string json)
{
return JsonConvert.DeserializeObject<List<OrderResponse>>(json, BitMEX.JSONClass.Order.Converter.Settings);
}
}
internal static class Converter
{
public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
DateParseHandling = DateParseHandling.None,
Converters =
{
new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
},
};
}
}
我用来处理这种情况的方法看起来像这样,我不太喜欢它,因为我确信它可以更干净:
private object ProcessJSONOrderResponse(string res, Boolean isArray = false)
{
if (isArray)
{
List<OrderResponse> multiOrderResp = OrdersResponse.FromJson(res);
if (multiOrderResp.Count > 0)
{
return multiOrderResp;
}
else
{
var orderError = OrderError.FromJson(res);
if (orderError.Error != null)
{
return orderError;
}
else
{
orderError = new OrderError();
orderError.Error.Name = "Custom error";
orderError.Error.Message = "No JSON response received...";
return orderError;
}
}
}
else
{
var oderResp = OrderResponse.FromJson(res);
if (oderResp.OrderId != null)
{
return oderResp;
}
else
{
var orderError = OrderError.FromJson(res);
if (orderError.Error != null)
{
return orderError;
}
else
{
orderError = new OrderError();
orderError.Error.Name = "Custom error";
orderError.Error.Message = "No JSON response received...";
return orderError;
}
}
}
}
因此,我需要一种以最有效的方式处理 JSON 反序列化为 OrderResponse、OrderResponse 或 OrderError 的方法,并进行完整的错误处理。一旦我知道如何做到这一点,我将能够处理更多这样的案例并构建我的 API 客户端。
非常感谢您提前提供了一些信息。我将永远感激不尽。
解决方案
推荐阅读
- javascript - 数组内参数的Javascript if语句
- html - 为什么子填充会扩大父宽度?
- tensorflow - 来自 conda 的 Tensorflow-gpu 2.5.0 无法识别 GPU
- reactjs - Formik 的“isSubmitting”何时设置回 False?
- flutter - 每个页面底部的持久小部件
- node.js - 如何使用从数据库中获取的唯一用户 ID 来调用带有 socket.io 的用户
- ios - 将委托协议一致性添加到纯 swift 类
- javascript - 如何测试反应下拉表单
- echarts - 基于Echart数据点击事件重定向窗口位置
- python - 如何从列表中获取一个值并遍历一个单独的字符串以找到该值所在的索引?