MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Use globalmente um JsonConverter em uma classe sem o atributo


Sim, você pode usar um IContractResolver personalizado para aplicar programaticamente um JsonConverter para uma classe ou propriedade. A maneira mais simples de fazer isso é derivar seu resolvedor do DefaultContractResolver class e, em seguida, substitua o método apropriado. Abaixo está um exemplo de resolvedor que instrui o Json.Net a usar um ObjectIdConverter em todas as instâncias do ObjectId tipo, independentemente da classe em que possam aparecer.
class CustomResolver : DefaultContractResolver
{
    protected override JsonObjectContract CreateObjectContract(Type objectType)
    {
        JsonObjectContract contract = base.CreateObjectContract(objectType);
        if (objectType == typeof(ObjectId))
        {
            contract.Converter = new ObjectIdConverter();
        }
        return contract;
    }
}

Para usar o resolvedor, você pode construir um JsonSerializer instância e defina o ContractResolver propriedade nele e use essa instância para fazer sua serialização/desserialização. Se você estiver usando JObject.ToObject() e JObject.FromObject() , observe que ambos os métodos têm sobrecargas que aceitam um JsonSerializer instância.
JsonSerializer serializer = new JsonSerializer();
serializer.ContractResolver = new CustomResolver();

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

Como alternativa, se você estiver usando o JsonConvert class para fazer sua serialização/desserialização, você pode criar uma instância de JsonSerializerSettings , defina o ContractResolver propriedade sobre isso, então passe as configurações para o SerializeObject() e DeserializeObject() métodos.
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();

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

Espero que isto ajude.