【问题标题】:How to parse json objects inside json array in c#?如何在c#中解析json数组中的json对象?
【发布时间】:2020-09-18 10:42:19
【问题描述】:

我有一个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; }

}

但它只适用于第一种情况。如何改进它以涵盖第二种示例格式?

提前致谢。

【问题讨论】:

  • 你不必顺便引用你的 JSON(> 前缀)
  • 如果您仔细查看“示例 2”JSON,您会注意到您没有订单数组 - 您有一个或多个订单数组。因此,在 .NET 中,这将是一个订单列表,而不仅仅是一个订单列表。至于如何使用相同的代码反序列化它们,我可能会创建一个JsonConverter 以应用于List&lt;Order&gt;,然后让它解决JTokenJObjectJArray 并反序列化因此。以后有时间我会帮忙的。

标签: c# arrays json


【解决方案1】:

我写了一个转换器,应该可以帮到你:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多