MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Utilizzare globalmente un JsonConverter su una classe senza l'attributo

Sì, puoi utilizzare un IContractResolver personalizzato per applicare a livello di codice un JsonConverter a una classe o proprietà. Il modo più semplice per farlo è derivare il tuo risolutore da DefaultContractResolver class e quindi sovrascrivere il metodo appropriato. Di seguito è riportato un esempio di risolutore che indica a Json.Net di utilizzare un ObjectIdConverter su tutte le istanze di ObjectId digita, indipendentemente dalla classe in cui potrebbero apparire.

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

Per utilizzare il risolutore, puoi costruire un JsonSerializer istanza e impostare il ContractResolver proprietà su di esso, quindi usa quell'istanza per eseguire la serializzazione/deserializzazione. Se stai usando JObject.ToObject() e JObject.FromObject() , nota che entrambi i metodi hanno overload che accettano un JsonSerializer esempio.

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

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

In alternativa, se stai usando JsonConvert classe per eseguire la serializzazione/deserializzazione, puoi creare un'istanza di JsonSerializerSettings , imposta il ContractResolver proprietà su quello, quindi passa le impostazioni a SerializeObject() e DeserializeObject() metodi.

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

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

Spero che questo aiuti.