52

Json.Netを使用して、オブジェクトをシリアル化/逆シリアル化するために特別な注意が必要なプロパティをオブジェクトに持っています。の子孫を作ることでJsonConverter、これを成功させることができました。これを行う一般的な方法は次のとおりです。

public class SomeConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        ...
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        ...
    }

    public override bool CanConvert(Type objectType)
    {
        ...
    }
}

class SomeClass
{
    [JsonProperty, JsonConverter(typeof(SomeConverter))]
    public SomeType SomeProperty;
}

//Later on, in code somewhere
SomeClass SomeObject = new SomeClass();
string json = JsonConvert.SerializeObject(SomeObject, new SomeConverter());

このコードに関する私の問題は、すべてのシリアライゼーション/デシリアライゼーションでカスタム コンバーターを導入する必要があることです。私のプロジェクトでは、それができない場合がたくさんあります。たとえば、Json.Net を利用する他の外部プロジェクトも使用しており、それらは私のSomeClassインスタンスで動作します。しかし、彼らのコードを変更したくない、または変更できないため、コンバーターを導入する方法がありません。

staticおそらくいくつかのメンバーを使用して Json.Net でコンバーターを登録する方法はありますか?

4

3 に答える 3

17

別のアプローチ (@Brian が上記で言及したものよりも優先される) は、カスタム コントラクト リゾルバーを実装することです。

JsonFormatter.SerializerSettings.ContractResolver = new CustomContractResolver();

そして、実装はかなり簡単です

public class CustomContractResolver : DefaultContractResolver
{
    private static readonly JsonConverter _converter = new MyCustomConverter();
    private static Type _type = typeof (MyCustomType);

    protected override JsonConverter ResolveContractConverter(Type objectType)
    {
        if (objectType == null || !_type.IsAssignableFrom(objectType)) // alternatively _type == objectType
        {
            return base.ResolveContractConverter(objectType);
        }

        return _converter;
    }
}

どちらの方法も有効ですが、これはより大きなハンマーです

于 2014-02-25T18:44:45.553 に答える