Вие внедрявате ReadJson метод на конвертора неправилно. existingValue параметърът не ви дава десериализираната стойност, прочетена от JSON, той ви дава съществуващата стойност на обекта, който ще замените . В повечето случаи това ще бъде нула или празно. Това, което трябва да направите, е да използвате reader за да получите стойността от JSON, конвертирайте я според нуждите, след което върнете конвертираната стойност.
Приемаме вашия ObjectId има конструктор, който приема шестнадесетичен низ, ето как бихте имплементирали ReadJson метод:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
return new ObjectId(token.ToObject<string>());
}