您需要逐一检查响应,并根据它们的内容进行不同的处理。
您可以动态加载 JSON,然后根据加载的内容反序列化它们。
即对象反序列化为对象,数组反序列化为数组。
以下是您如何实现该目标的示例:
.Net Fiddle 这个工作。
using System;
using Newtonsoft.Json.Linq;
public class Program
{
public static void Main()
{
var json = "[{ \"response\" : { \"test\" : \"Value1\" } }, { \"response\" : [ { \"test\" : \"Value2\" }, { \"test\" : \"Value3\" }] }]";
var responseContainers = JArray.Parse(json);
foreach(var responseContainer in responseContainers)
{
var response = responseContainer.Value<JToken>("response");
if(response.Type == JTokenType.Object)
{
var data = response.ToObject<Data>();
Console.WriteLine("data: " + data.test);
}
else if(response.Type == JTokenType.Array)
{
var dataJArray = response.ToObject<JArray>();
foreach(var dataJToken in dataJArray)
{
var data = dataJToken.ToObject<Data>();
Console.WriteLine("datas: " + data.test);
}
}
}
}
}
public class Data
{
public string test { get;set; }
}
输出:
data: Value1
datas: Value2
datas: Value3
或者,您可以使用此question 中的SingleOrArrayConverter。
.Net Fiddle
using System;
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
public class Program
{
public static void Main()
{
var json = "[{ \"response\" : { \"test\" : \"Value1\" } }, { \"response\" : [ { \"test\" : \"Value2\" }, { \"test\" : \"Value3\" }] }]";
var items = JsonConvert.DeserializeObject<List<Item>>(json);
foreach(var item in items)
{
var responses = item.response;
Console.WriteLine("ResponseCount: " + responses.Count);
foreach(var response in responses)
{
Console.WriteLine("response: " + response.test);
}
}
}
}
public class Item
{
[JsonConverter(typeof(SingleOrArrayConverter<Data>))]
public List<Data> response { get;set; }
}
public class Data
{
public string test { get;set; }
}
class SingleOrArrayConverter<T> : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(List<T>));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Array)
{
return token.ToObject<List<T>>();
}
return new List<T> { token.ToObject<T>() };
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
输出:
ResponseCount: 1
response: Value1
ResponseCount: 2
response: Value2
response: Value3