如何在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
文件,它具有以下格式之一:
{
"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
,并进行相应的反序列化。如果我有时间的话,我以后会帮忙的。可能会有帮助: