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

我知道 ASP.NET Web API 本身使用 Json.NET 来(反)序列化对象,但是有没有一种方法可以指定一个您希望它使用的 JsonSerializerSettings对象呢?

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

125175 次浏览

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

例如,您可以在 Application _ Start ()方法中这样做:

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

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

单个 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

答案是将这两行代码添加到 Global.asax.cs Application _ Start 方法中

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

参考资料: 处理循环对象引用