簡體   English   中英

如何在c#中解析json數組中的json對象?

[英]How to parse json objects inside json array in c#?

我有一個json文件,它具有以下任一格式:

  1. 示例 1:
{
  "MyOrders": [
    {
      "order": "my order1",
      "url": "tt"
    }
  ]
}

示例 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"
      }
    ]
  ]
}

我有以下代碼:

InputItems root = JsonConvert.DeserializeObject<InputItems>(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; }

}

但它僅適用於第一種情況。 如何改進它以涵蓋第二種示例格式?

提前致謝。

我寫了一個轉換器,應該可以幫助你:

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();
    }
}

這將適用於以下 JSON 示例。

示例 1:

{
    "MyOrders": [{
            "order": "my order1",
            "url": "tt"
        }
    ]
}

示例 2:

{
    "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>))]

看起來像這樣:

public class InputItems
{
    [JsonProperty("MyOrders")]
    [JsonConverter(typeof(SingleArrayOrNestedConverter<Order>))]
    public List<Order> objects { get; set; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM