如何处理JSON输出,该输出可能是同一调用的对象数组,objectA或objectB

时间:2019-07-14 09:41:57

标签: c# json rest object deserialization

首先,我是一名业余编码员,所以答案越长越详细,我就会理解得越快。预先感谢您的耐心等候。

我正在研究的项目正在建立一个客户端类,以与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客户端。

在此先感谢您提供一些帮助。我将永远感激不已。

0 个答案:

没有答案