2013-10-22 7 views
26

Json.Netを使用すると、私は自分のオブジェクトにプロパティを持ちます。これらのオブジェクトは、シリアル化/デシリアライズするために特別な注意が必要です。 JsonConverterの子孫にすることで、私はこれを成功裏に達成することができました。これは、これを行うための一般的な方法です。このコードで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ではおそらくシリアル化/デシリアライズが発生しても、コンバータは常に存在しますか?

答えて

46

はい、これはJson.Net 5.0.5以降で可能です。 JsonConvert.DefaultSettingsを参照してください。

JsonConvert.DefaultSettings =() => new JsonSerializerSettings 
{ 
    Converters = new List<JsonConverter> { new SomeConverter() } 
}; 

// Later on... 
string json = JsonConvert.SerializeObject(someObject); // this will use SomeConverter 

は、Web APIを使用している場合は、代わりにグローバルこのようにコンバータを設定することができます。

var config = GlobalConfiguration.Configuration; 
var jsonSettings = config.Formatters.JsonFormatter.SerializerSettings; 
jsonSettings.Converters.Add(new SomeConverter()); 
+0

おかげで百万ちょうど大きなハンマーで、あなたは私の一日行わ:) – Mehran

+0

私はApp_Start()イベントでこれを行う場合、私はasp.netのWeb APIでエラーが出ます。 「メソッドが見つかりませんでした:」Void Newtonsoft.Json.JsonConvert.set_DefaultSettings' –

+0

@DonnyV。 JSON.NETの古いバージョンを使用している可能性があります。これはweb.configに追加されたバージョンリダイレクトのためにコンパイルされます。 – BrainSlugs83

13

(上記言及@Brian 1よりも優先で勝利)別のアプローチは、にありますカスタム契約リゾルバ

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; 
    } 
} 

どちらの方法が有効で、この1つは

+0

うーん、 'JsonFormatter'はもう存在しないのですか? – GregaMohorko

+0

WebAPI 2.xでは、どのフレームワークで作業していますか? Mvcコア?そこには、JsonInputFormatterとJsonOutputFormatter –

+0

.NET Framework 4.6.1があります。私が見つけたのは 'JsonSerializerSettings'型で、' ContractResolver'プロパティを持つ 'JsonConvert.DefaultSettings'ですが、このアプローチは@Brianのものと変わりません。 – GregaMohorko

関連する問題