我写了一个可以帮助你的转换器:
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; }
}