MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Verwenden Sie global einen JsonConverter für eine Klasse ohne das Attribut

Ja, Sie können einen benutzerdefinierten IContractResolver verwenden um einen JsonConverter programmgesteuert anzuwenden zu einer Klasse oder Eigenschaft. Der einfachste Weg, dies zu tun, besteht darin, Ihren Resolver vom DefaultContractResolver abzuleiten Klasse und überschreiben dann die entsprechende Methode. Unten ist ein Beispiel-Resolver, der Json.Net anweist, einen ObjectIdConverter zu verwenden auf allen Instanzen der ObjectId Typ, unabhängig davon, in welcher Klasse sie vorkommen.

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

Um den Resolver zu verwenden, können Sie einen JsonSerializer erstellen -Instanz und legen Sie den ContractResolver fest -Eigenschaft darauf, und verwenden Sie dann diese Instanz, um Ihre Serialisierung/Deserialisierung durchzuführen. Wenn Sie JObject.ToObject() verwenden und JObject.FromObject() Beachten Sie, dass beide Methoden Überladungen haben, die einen JsonSerializer akzeptieren Beispiel.

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

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

Alternativ, wenn Sie JsonConvert verwenden Klasse, um Ihre Serialisierung/Deserialisierung durchzuführen, können Sie eine Instanz von JsonSerializerSettings erstellen , legen Sie den ContractResolver fest Eigenschaft darauf, dann übergeben Sie die Einstellungen an SerializeObject() und DeserializeObject() Methoden.

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

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

Hoffe das hilft.