У меня была похожая ситуация, когда 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();
}
}