如何在c#中解析json数组中的json对象?

如何在c#中解析json数组中的json对象?,c#,arrays,json,C#,Arrays,Json,我有一个json文件,它具有以下格式之一: 样本1: 样本2: { "MyOrders": [ [ { "order": "my order 1", "url": "ddfdfd" }, { "order": "order 2", "ur

我有一个
json
文件,它具有以下格式之一:

  • 样本1:
  • 样本2:

    {
      "MyOrders": [
        [
          {
            "order": "my order 1",
            "url": "ddfdfd"
          },
          {
            "order": "order 2",
            "url": "asdfwe"
          }
         ],
         [
          {
            "order": "my order 3",
            "url": "ertrt"
          },
          {
            "order": "my order 4",
            "url": "werwe"
          }
        ]
      ]
    }
    
    {
        "MyOrders": [
            [{
                    "order": "my order1",
                    "url": "tt"
                }
            ]]
    }
    
    我有以下代码:

    InputItems root = JsonConvert.DeserializeObject<InputItems>(myJsonText);
    
    InputItems root=JsonConvert.DeserializeObject(myJsonText);
    
    我有以下课程:

    public class InputItems 
        {
                [JsonProperty("MyOrders")]
                public List<Order> objects { get; set; }
            
        }
    
        public class Order
        {
    
            [JsonProperty("order")]
            public string order{ get; set; }
    
            [JsonProperty("url")]
            public string url { get; set; }
    
    }
    
    公共类输入项
    {
    [JsonProperty(“MyOrders”)]
    公共列表对象{get;set;}
    }
    公共阶级秩序
    {
    [JsonProperty(“订单”)]
    公共字符串顺序{get;set;}
    [JsonProperty(“url”)]
    公共字符串url{get;set;}
    }
    
    但它只适用于第一种情况。我如何改进它以涵盖第二种样本格式


    提前感谢。

    我写了一个转换器,它应该可以帮助您:

    public class SingleArrayOrNestedConverter<TItemType> : JsonConverter<List<TItemType>>
    {
        public override List<TItemType> ReadJson(JsonReader reader, Type objectType, List<TItemType> existingValue, bool hasExistingValue, JsonSerializer serializer)
        {
            // Read the object as JSON
            var token = JToken.ReadFrom(reader);
            if (token is JObject) // it's just a lone object, so wrap it in a list and return it
            {
                return new List<TItemType>() { token.ToObject<TItemType>(serializer) };
            }
            else if (token is JArray arrayOfObjects) // it's an array of objects, so let's loop through
            {
                var result = new List<TItemType>();
                foreach (var item in arrayOfObjects)
                {
                    if (item is JObject) // the nested item is an object, so let's add it to the list
                    {
                        result.Add(item.ToObject<TItemType>(serializer));
                    }
                    else if (item is JArray nestedArrayOfObjects) // the nested item is an array, so let's loop through it
                    {
                        foreach (var nestedItem in nestedArrayOfObjects)
                        {
                            // this will throw an exception if nestedItem doesn't represent an object
                            result.Add(nestedItem.ToObject<TItemType>(serializer));
                        }
                    }
                }
                return result;
            }
            return null;
        }
    
        // we can't use this code for serializing so make sure JSON.NET doesn't try
        public override bool CanWrite => false;
    
        public override void WriteJson(JsonWriter writer, List<TItemType> value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    }
    
    样本2:

    {
      "MyOrders": [
        [
          {
            "order": "my order 1",
            "url": "ddfdfd"
          },
          {
            "order": "order 2",
            "url": "asdfwe"
          }
         ],
         [
          {
            "order": "my order 3",
            "url": "ertrt"
          },
          {
            "order": "my order 4",
            "url": "werwe"
          }
        ]
      ]
    }
    
    {
        "MyOrders": [
            [{
                    "order": "my order1",
                    "url": "tt"
                }
            ]]
    }
    
    样本3:

    {
        "MyOrders": {
            "order": "my order1",
            "url": "tt"
        }
    }
    
    样本4:

    {
        "MyOrders": [
            [{
                    "order": "my order1",
                    "url": "tt"
                }
            ], {
                "order": "my order1",
                "url": "tt"
            }
        ]
    }
    
    要将其应用到代码中,您需要使用
    JsonConverterAttribute

    [JsonConverter(typeof(SingleArrayOrNestedConverter<Order>))]
    
    [JsonConverter(typeof(singleArraryNestedConverter))]
    
    看起来是这样的:

    public class InputItems
    {
        [JsonProperty("MyOrders")]
        [JsonConverter(typeof(SingleArrayOrNestedConverter<Order>))]
        public List<Order> objects { get; set; }
    }
    
    公共类输入项
    {
    [JsonProperty(“MyOrders”)]
    [JsonConverter(类型(SingleArraryNestedConverter))]
    公共列表对象{get;set;}
    }
    
    顺便说一句,你不必引用你的JSON(>前缀)。如果你仔细观察你的“样本2”JSON,你会发现你没有订单数组——你有一个或多个订单数组。因此,在.NET中,这将是一个顺序列表,而不仅仅是一个顺序列表。至于如何用相同的代码反序列化它们,我可能会创建一个
    JsonConverter
    应用于
    List
    ,然后计算
    JToken
    是一个
    JObject
    还是
    JArray
    ,并进行相应的反序列化。如果我有时间的话,我以后会帮忙的。可能会有帮助: