MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Utiliser globalement un JsonConverter sur une classe sans l'attribut

Oui, vous pouvez utiliser un IContractResolver personnalisé pour appliquer par programmation un JsonConverter à une classe ou à une propriété. La façon la plus simple de le faire est de dériver votre résolveur du DefaultContractResolver classe, puis remplacez la méthode appropriée. Vous trouverez ci-dessous un exemple de résolveur qui demande à Json.Net d'utiliser un ObjectIdConverter sur toutes les instances de ObjectId type, quelle que soit la classe dans laquelle ils peuvent apparaître.

class CustomResolver : DefaultContractResolver
{
    protected override JsonObjectContract CreateObjectContract(Type objectType)
    {
        JsonObjectContract contract = base.CreateObjectContract(objectType);
        if (objectType == typeof(ObjectId))
        {
            contract.Converter = new ObjectIdConverter();
        }
        return contract;
    }
}

Pour utiliser le résolveur, vous pouvez construire un JsonSerializer instance et définissez le ContractResolver propriété dessus, puis utilisez cette instance pour effectuer votre sérialisation/désérialisation. Si vous utilisez JObject.ToObject() et JObject.FromObject() , notez que les deux méthodes ont des surcharges qui acceptent un JsonSerializer exemple.

JsonSerializer serializer = new JsonSerializer();
serializer.ContractResolver = new CustomResolver();

JObject jo = JObject.FromObject(foo, serializer);

Alternativement, si vous utilisez le JsonConvert class pour faire votre sérialisation/désérialisation, vous pouvez créer une instance de JsonSerializerSettings , définissez le ContractResolver propriété dessus, puis passez les paramètres à SerializeObject() et DeserializeObject() méthodes.

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();

Foo foo = JsonConvert.DeserializeObject<Foo>(json, settings);

J'espère que cela vous aidera.