首先,我是一名业余编码员,所以答案越长越详细,我就会理解得越快。预先感谢您的耐心等候。
我正在研究的项目正在建立一个客户端类,以与BitMEX(https://testnet.bitmex.com/api/explorer/#/Order)的REST API进行通信。
我试图从BitMEX网站上的招摇规格生成c#代码,但是即使发现了一些错误,我也未能成功使它工作。不幸的是,我找不到很多有关其生成的代码的文档,但这是另一次讨论。 :)
在这里,我遇到一种情况,即一个类应反序列化可具有3种结果的JSON调用。我可以有一个OrderResponse数组,一个OrderResponse或一个OrderError。处理这种情况的最佳方法是什么,进行所有转换的最佳位置是什么?
到目前为止,我的订单类看起来像这样:
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客户端。
在此先感谢您提供一些帮助。我将永远感激不已。