您需要做的是创建一个自定义转换器并使用继承。
首先,我进行了更改,以便有两个子类:
public class JsonTestObject
{
}
public class JsonTestResultValue : JsonTestObject
{
public int b;
public int c;
}
public class JsonTestResultArray : JsonTestObject
{
public JArray Array { get; set; }
public JsonTestResultArray(JArray array)
{
Array = array;
}
}
主要结构中使用了哪些:
public class JsonTest
{
public JsonTestResult[] result;
}
public class JsonTestResult
{
public JsonTestObject a;
}
然后,我们需要能够确定要使用哪些子类。为此,我们可以检查开始标记是用于对象还是用于数组。这是在 a 内完成的JsonConverter
:
public class JsonTestConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(JsonTestObject).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader,
Type objectType, object existingValue, JsonSerializer serializer)
{
//Is it an array?
var token = reader.TokenType;
if (token == JsonToken.StartArray)
{
var array = JArray.Load(reader);
return new JsonTestResultArray(array);
}
var item = JObject.Load(reader);
return item.ToObject<JsonTestResultValue>();
}
public override bool CanWrite
{
get { return false; }
}
public override void WriteJson(JsonWriter writer,
object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
最后,您必须在反序列化时指定转换器:
class Program
{
static void Main(string[] args)
{
var str = @"{
""result"":
[
{""a"":{""b"":1,""c"":2}},
{""a"":{""b"":1,""c"":2}},
{""a"":{""b"":1,""c"":2}},
{""a"":[]}
]
}";
var deserializedObject = JsonConvert.DeserializeObject<JsonTest>(str, new JsonTestConverter());
}
}
您可能希望根据您在JsonTestResultArray
.