sql >> Base de Datos >  >> NoSQL >> MongoDB

Use globalmente un JsonConverter en una clase sin el atributo

Sí, puede usar un IContractResolver personalizado para aplicar programáticamente un JsonConverter a una clase o propiedad. La forma más sencilla de hacer esto es derivar su resolución del DefaultContractResolver clase y luego invalidar el método apropiado. A continuación se muestra un ejemplo de resolución que le indica a Json.Net que use un ObjectIdConverter en todas las instancias de ObjectId tipo, independientemente de la clase en la que puedan 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 el resolver, puede construir un JsonSerializer instancia y establezca el ContractResolver property en él, luego use esa instancia para hacer su serialización/deserialización. Si está utilizando JObject.ToObject() y JObject.FromObject() , tenga en cuenta que ambos métodos tienen sobrecargas que aceptan un JsonSerializer instancia.

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

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

Alternativamente, si está utilizando JsonConvert class para hacer su serialización/deserialización, puede crear una instancia de JsonSerializerSettings , configure el ContractResolver propiedad en eso, luego pase la configuración a SerializeObject() y DeserializeObject() métodos.

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

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

Espero que esto ayude.