如何在MVC 4 Web API中为Json.NET设置自定义JsonSerializerSettings?

时间:2012-11-07 17:07:54

标签: c# asp.net-web-api json.net

我知道ASP.NET Web API本身使用Json.NET来(反)序列化对象,但是有没有办法指定你想要它使用的JsonSerializerSettings对象?

例如,如果我想将type信息包含在序列化的JSON字符串中该怎么办?通常我会将设置注入.Serialize()调用,但Web API会默默地执行此操作。我找不到手动注入设置的方法。

3 个答案:

答案 0 :(得分:104)

您可以使用JsonSerializerSettings对象中的Formatters.JsonFormatter.SerializerSettings属性自定义HttpConfiguration

例如,您可以在Application_Start()方法中执行此操作:

protected void Application_Start()
{
    HttpConfiguration config = GlobalConfiguration.Configuration;
    config.Formatters.JsonFormatter.SerializerSettings.Formatting =
        Newtonsoft.Json.Formatting.Indented;
}

答案 1 :(得分:35)

您可以为每个JsonSerializerSettings指定JsonConvert,并且可以设置全局默认值。

带有重载的

JsonConvert

// Option #1.
JsonSerializerSettings config = new JsonSerializerSettings { ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore };
this.json = JsonConvert.SerializeObject(YourObject, Formatting.Indented, config);

// Option #2 (inline).
JsonConvert.SerializeObject(YourObject, Formatting.Indented,
    new JsonSerializerSettings() {
        ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
    }
);
在Global.asax.cs中使用Application_Start()中的代码

全局设置

JsonConvert.DefaultSettings = () => new JsonSerializerSettings {
     Formatting = Newtonsoft.Json.Formatting.Indented,
     ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
};

参考:https://github.com/JamesNK/Newtonsoft.Json/issues/78

答案 2 :(得分:2)

答案是将这两行代码添加到Global.asax.cs Application_Start方法

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = 
    Newtonsoft.Json.PreserveReferencesHandling.All;

参考:Handling Circular Object References