using System.Collections.Generic;
using Newtonsoft.Json.Linq;
public static void Main()
""Birthday"": ""1988-10-06T00:00:00""
""LastName"": ""Schmoe"",
RootModelConverter converter = new RootModelConverter();
RootModel model = JsonConvert.DeserializeObject<RootModel>(json, converter);
model.Addresses.Add(new Address
Street = "123 Main Street",
foreach (var person in model.People)
json = JsonConvert.SerializeObject(model, Formatting.Indented);
model = JsonConvert.DeserializeObject<RootModel>(json, converter);
foreach (var person in model.People)
Address addr = model.Addresses.FirstOrDefault(a => a.Id == person.AddressId);
Console.Write(person.FirstName + " " + person.LastName);
Console.WriteLine(addr != null ? " lives in " + addr.City + ", " + addr.State : "");
public class RootModelConverter : JsonConverter
public override bool CanConvert(Type objectType)
return objectType == typeof(RootModel);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
JToken token = JToken.Load(reader);
RootModel model = new RootModel();
if (token.Type == JTokenType.Array)
model.People = token.ToObject<List<Person>>(serializer);
model.Addresses = new List<Address>();
else if (token.Type == JTokenType.Object)
string version = (string)token["Version"];
serializer.Populate(token.CreateReader(), model);
throw new JsonException("Unexpected version: " + version);
throw new JsonException("Unexpected token: " + token.Type);
public override bool CanWrite
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();
public int Version { get { return 4; } }
public List<Person> People { get; set; }
public List<Address> Addresses { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime? Birthday { get; set; }
public int AddressId { get; set; }
string[] parts = value.Split(' ');
if (parts.Length > 0) FirstName = parts[0];
if (parts.Length > 1) LastName = parts[1];
public int Id { get; set; }
public string Street { get; set; }
public string City { get; set; }
public string State { get; set; }
public string PostalCode { get; set; }
public string Country { get; set; }