首页 > 解决方案 > 如何处理可能是同一调用的对象数组、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 客户端。

非常感谢您提前提供了一些信息。我将永远感激不尽。

标签: c#jsonrestobjectdeserialization

解决方案


推荐阅读