我遇到过类似的情况,API 要么返回一个对象数组,要么只返回一个不在数组中的对象(如果只有一个结果)。我完全无法让 DataContractJsonSerializer 做到这一点。我最终不得不切换到 JSON.NET 库并稍微摆弄一下 JsonConverters 以使其正常工作。
在您的 DataContract 中,将“c”声明为 Inner 类型。
[DataMember(Name = "c")]
public Inner C { get; set; }
然后编写一个 JsonConverter 来检查令牌类型,并在反序列化器尝试反序列化 Inner 时做正确的事情。
internal class StringOrInnerConverter : JsonConverter {
public override bool CanConvert(Type objectType) {
return objectType == typeof(Inner);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
var ser = new JsonSerializer();
if (reader.TokenType == JsonToken.StartObject) {
var inn = ser.Deserialize<Inner>(reader);
return inn;
} else if (reader.TokenType == JsonToken.String) {
var str = ser.Deserialize<string>(reader);
return (Inner)str; // Or however you want to convert string to Inner
} else {
return default(Inner);
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
throw new System.NotImplementedException();
}
}