using System.Collections.Generic;
using Newtonsoft.Json.Linq;
public static void Main(string[] args)
""email"": ""john.doe@sendgrid.com"",
""timestamp"": 1337966815,
""email"": ""jane.doe@sendgrid.com"",
""timestamp"": 1337966815,
""category"": ""olduser"",
List<Item> list = JsonConvert.DeserializeObject<List<Item>>(json);
foreach (Item obj in list)
Console.WriteLine("email: " + obj.Email);
Console.WriteLine("timestamp: " + obj.Timestamp);
Console.WriteLine("event: " + obj.Event);
Console.WriteLine("categories: " + string.Join(", ", obj.Categories));
json = JsonConvert.SerializeObject(list, Formatting.Indented);
public string Email { get; set; }
[JsonProperty("timestamp")]
public int Timestamp { get; set; }
public string Event { get; set; }
[JsonProperty("category")]
[JsonConverter(typeof(SingleOrArrayConverter<string>))]
public List<string> Categories { 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 void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
List<T> list = (List<T>)value;
serializer.Serialize(writer, value);