An alternative would be to write our JsonConverter
and use it for deserialization so that we can work with static types after conversion.
class JsonDataConverter : JsonConverter { public override bool CanWrite { get { return false; } } public override bool CanConvert(Type objectType) { return objectType == typeof(Data); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var token = JToken.ReadFrom(reader); if (token is JArray) return new Data(token.Select(t => t["prop"].ToString())); if (token is JObject) return new Data(new[] { token["prop"].ToString() }); throw new NotSupportedException(); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } } [JsonConverter(typeof(JsonDataConverter))] class Data:List<string> { public Data() : base() { } public Data(IEnumerable<string> data) : base(data) { } } class Response { public string Status { get; set; } public Data Data { get; set; } }
and example:
class Program { static void Main(string[] args) { var inputObj = @"{ 'response': { 'status':'success', // Could be either a single object or an array of objects. 'data': { 'prop':'value'} } }"; var inputArray = @"{ 'response': { 'status':'success', // Could be either a single object or an array of objects. 'data':[ { 'prop':'value'}, { 'prop':'value'} ] } }"; var obj = JsonConvert.DeserializeAnonymousType(inputObj, new { Response = new Response() }); foreach(var prop in obj.Response.Data) Console.WriteLine(prop); var arr = JsonConvert.DeserializeAnonymousType(inputArray, new { Response = new Response() }); foreach (var prop in arr.Response.Data) Console.WriteLine(prop); } }
source share