Json.NET supports serialization callback methods. A callback can be used to manipulate an object before and after its serialization and deserialization by the JsonSerializer.
- OnSerializing
- OnSerialized
- OnDeserializing
- OnDeserialized
To tell the serializer which methods should be called during the object's serialization lifecycle, decorate a method with the appropraite attribute (OnSerializingAttribute, OnSerializedAttribute, OnDeserializingAttribute, OnDeserializedAttribute).
Example object with serialization callback methods:
public class SerializationEventTestObject
{
  // This member is serialized and deserialized with no change.
public int Member1 { get; set; }
  // The value of this field is set and reset during and 
  // after serialization.
public string Member2 { get; set; }
  // This field is not serialized. The OnDeserializedAttribute 
  // is used to set the member value after serialization.
  [JsonIgnore]
public string Member3 { get; set; }
  // This field is set to null, but populated after deserialization.
public string Member4 { get; set; }
  public SerializationEventTestObject()
  {
Member1 = 11;
    Member2 = "Hello World!";
    Member3 = "This is a nonserialized value";
    Member4 = null;
}
  [OnSerializing]
internal void OnSerializingMethod(StreamingContext context)
  {
    Member2 = "This value went into the data file during serialization.";
}
  [OnSerialized]
internal void OnSerializedMethod(StreamingContext context)
  {
    Member2 = "This value was reset after serialization.";
}
  [OnDeserializing]
internal void OnDeserializingMethod(StreamingContext context)
  {
    Member3 = "This value was set during deserialization";
}
  [OnDeserialized]
internal void OnDeserializedMethod(StreamingContext context)
  {
    Member4 = "This value was set after deserialization.";
}
}
The example object being serialized and deserialized by Json.NET:
SerializationEventTestObject obj = new SerializationEventTestObject();
Console.WriteLine(obj.Member1);
// 11
Console.WriteLine(obj.Member2);
// Hello World!
Console.WriteLine(obj.Member3);
// This is a nonserialized value
Console.WriteLine(obj.Member4);
// null
string json = JsonConvert.SerializeObject(obj, Formatting.Indented);
// {
//   "Member1": 11,
//   "Member2": "This value went into the data file during serialization.",
//   "Member4": null
// }
Console.WriteLine(obj.Member1);
// 11
Console.WriteLine(obj.Member2);
// This value was reset after serialization.
Console.WriteLine(obj.Member3);
// This is a nonserialized value
Console.WriteLine(obj.Member4);
// null
obj = JsonConvert.DeserializeObject<SerializationEventTestObject>(json);
Console.WriteLine(obj.Member1);
// 11
Console.WriteLine(obj.Member2);
// This value went into the data file during serialization.
Console.WriteLine(obj.Member3);
// This value was set during deserialization
Console.WriteLine(obj.Member4);
// This value was set after deserialization.