如何检查 JSON 输出是否返回 1 行或多行,以便可以使用字符串或数组列表并相应地映射到 C# 中的对象



如何检查 JSON 输出是否只返回 1 行元素或多行。例如,我有以下 JSON 输出。

{
    "orders": {
        "order": [
            {
                "id": 100,
                "type": "market",
                "symbol": "AAPL",
                "side": "buy"
            }]
    }
}

我有以下代码用于反序列化 JSON 输出:

 dynamic dynObj = JsonConvert.DeserializeObject(response);
 Console.WriteLine("ID: {0}n Type: {1}n Symbol: {2}n Side: {3}n", dynObj.orders.order.id, dynObj.orders.order.type,dynObj.orders.order.symbol,dynObj.orders.order.side;

但是,大多数时候我将输出作为订单对象数组,如下所示

 {
        "orders": {
            "order": [
                {
                    "id": 101,
                    "type": "market",
                    "symbol": "AAPL",
                    "side": "buy"
                },
                {
                    "id": 102,
                    "type": "market",
                    "symbol": "MSFT",
                    "side": "buy"
                },
                {
                    "id": 103,
                    "type": "limit",
                    "symbol": "AMZN",
                    "side": "buy"
                }
            ]
        }
    }

所以我反序列化上面的 Json 输出,如下所示:

dynamic dynObj = JsonConvert.DeserializeObject(response);
                    foreach (var c in dynObj.orders.order)
                    {
                        Console.WriteLine("Id : {0}n", c.id);
                        Console.WriteLine("Type : {0}n", c.type);
                        Console.WriteLine("Symbol : {0}n", c.symbol);
                        Console.WriteLine("Side : {0}n", c.side);                           
                    }

我有两个重要的问题:

  1. 我如何知道返回的 JSON 是否只有 1 行订单对象或集合,以便我可以使用相关方式进行循环。
  2. 如果是
  3. 数组,我是否需要按如下方式反序列化,如果是,如何我是否将它们添加到订单类/对象?

    RootObject ord = JsonConvert.DeserializeObject(response);

任何帮助将不胜感激。

我强烈建议您停止使用dynamic,因为我认为这是这种类型的滥用。相反,我会定义要反序列化的类型。通过这样做,您可以为自己提供类型安全性,并且处理数据变得微不足道。下面是使用泛型反序列化方法(Deserialize<T>(string input))的类定义示例。

 public class order
 {
      public int id { get; set; }
      public string type { get; set; }
      public string symbol { get; set; }
      public string side { get; set; }
 }
 public class orders
 {
      List<order> order { get; set; }
 }
 JsonSerializer serializer = new JsonSerializer();
 orders myOrders = serializer.Deserialize<orders>(response);
 if (myOrders.order.Count() == 1)
   // we have 1 order

能够修复与检查返回的 JSON 结果是对象还是数组有关的问题。修改了我的根对象,它具有数组/对象,如下所示:

 [JsonConverter(typeof(GenericListCreationJsonConverter<T>))]
 public List<T> order { get; set; }

添加了以下检查 JSON 的类

internal class GenericListCreationJsonConverter<T> : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return true;
        }
        public override bool CanRead
        {
            get { return true; }
        }
        public override bool CanWrite
        {
            get { return false; }
        }
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.StartArray)
            {
                return serializer.Deserialize<List<T>>(reader);
            }
            else
            {
                T t = serializer.Deserialize<T>(reader);
                return new List<T>(new[] { t });
            }
        }
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    }

相关内容

  • 没有找到相关文章

最新更新