2016-05-23 4 views
2

Iは、以下のクラスは、MVCのWebアプリケーションのデフォルトよりも良好なJSONシリアライザ(省略無関係ビット)を提供すること、代替JsonResult有し:そして私の 'カスタム' JsonDotNetResultにオプションの設定を提供するにはどうしたらいいですか?

public class JsonDotNetResult : JsonResult 
{ 
    public readonly JsonSerializerSettings Settings = new JsonSerializerSettings 
    { 
     PreserveReferencesHandling = PreserveReferencesHandling.Arrays, 
     ReferenceLoopHandling = ReferenceLoopHandling.Ignore, 
     ContractResolver = new CamelCasePropertyNamesContractResolver(), 
     Converters = new List<JsonConverter> { new StringEnumConverter() } 
    }; 

    public override void ExecuteResult(ControllerContext context) 
    { 
     ... 
     var response = context.HttpContext.Response; 
     ... 
     response.Write(JsonConvert.SerializeObject(Data, Settings)); 
    } 
} 

IはController.Jsonための過負荷、として宣言さを有します。

protected JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior, JsonSerializerSettings settings = null) 

が、私はJsonDotNetResultSettingsフィールドに設定され、既存のデフォルトの設定はありませんので、私は、発信者によって設定されたいくつかのプロパティで、新しいJsonSerializerSettingsに渡した場合、私は、すべてのプロパティが上書きされますSettingsオブジェクトのデフォルト値はJsonSerializerSettingsであり、呼び出し元から提供された新しい値が使用されます。後者が望まれ、前者は避けようとしている。

JsonSerializerSettingsプロパティ値のサブセットを渡して、のSettingsオブジェクトに適用するにはどうすればよいですか?私の最善の(そして最初の)努力は、デフォルトのSettingsオブジェクトのプロパティをループして、ユーザーが渡した新しいJsonSerializerSettingsオブジェクトのプロパティ値と比較し、異なる場合はSettingsの値をユーザー。

答えて

1

私はGlobal.asax.csにJsonConvertのグローバルデフォルト設定を定義します

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 

    JsonConvert.DefaultSettings =() => new JsonSerializerSettings 
    { 
     PreserveReferencesHandling = PreserveReferencesHandling.Arrays, 
     ReferenceLoopHandling = ReferenceLoopHandling.Ignore, 
     ContractResolver = new CamelCasePropertyNamesContractResolver(), 
     Converters = new List<JsonConverter> { new StringEnumConverter() } 
    }; 
} 

JsonConvert.DefaultSettingsは、コンバータで使用されるデフォルト設定を作成し、ラムダ関数です。独自の設定を指定すると、デフォルトの設定がオーバーライドされます。したがって、その設定を変更したい場合はいつでも、必要に応じて変更できるデフォルト設定の新しいコピーを入手するには、

var settings = (JsonSerializerSettings)JsonConvert.DefaultSettings.Invoke(); 

と連絡してください。

settings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; 

それはとにかくデフォルト設定を使用しますので、あなたがJsonDotNetResultからreadonly JsonSerializerSettings Settings = new JsonSerializerSettingsを削除することができますこの方法は:

public class JsonDotNetResult : JsonResult 
{ 
    public override void ExecuteResult(ControllerContext context) 
    { 
     ... 
     var response = context.HttpContext.Response; 
     ... 
     response.Write(JsonConvert.SerializeObject(Data)); 
    } 
} 

私はこの方法で好きなこと、それはあなたを保つように、あなたは一つの場所にあなたのデフォルト設定を持っているということですコードはきれいで、保守が簡単です。

関連する問題