Vous implémentez le ReadJson méthode du convertisseur de manière incorrecte. La valeur existingValue Le paramètre ne vous donne pas la valeur désérialisée lue à partir du JSON, il vous donne la valeur existante de l'objet que vous allez remplacer . Dans la plupart des cas, ce sera nul ou vide. Ce que vous devez faire est d'utiliser le reader pour obtenir la valeur du JSON, convertissez-la si nécessaire, puis renvoyez la valeur convertie.
En supposant que votre ObjectId class a un constructeur qui accepte une chaîne hexadécimale, voici comment implémenter le ReadJson méthode :
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JToken token = JToken.Load(reader);
return new ObjectId(token.ToObject<string>());
}