using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
public static void Main()
var tempo = new Tempo{Value = 1, Period = new Period{Count = 1, Foo = "bar", Start = DateTime.Now, End = DateTime.Now.AddDays(1)}};
Console.WriteLine(JsonConvert.SerializeObject(tempo));
Console.WriteLine(JsonConvert.SerializeObject(tempo, new TempoConverter()));
JsonSerializerSettings settings = new JsonSerializerSettings
ContractResolver = new WritablePropertiesOnlyResolver()
Console.WriteLine(JsonConvert.SerializeObject(tempo, settings));
class WritablePropertiesOnlyResolver : DefaultContractResolver
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
IList<JsonProperty> props = base.CreateProperties(type, memberSerialization);
return props.Where(p => p.PropertyName != "Period" || p.).ToList();
class TempoConverter : JsonConverter
public override bool CanConvert(Type objectType)
return (objectType == typeof (Tempo));
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
throw new NotImplementedException();
public override bool CanWrite
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
var type = value.GetType();
jo.Add("type", type.Name);
foreach (var prop in type.GetProperties().Where(x => x.CanRead))
object propVal = prop.GetValue(value, null);
jo.Add(prop.Name, JToken.FromObject(propVal, serializer));