忽略将枚举序列化为字符串的全局配置
本文关键字:字符串 全局 配置 序列化 枚举 | 更新日期: 2023-09-27 18:33:06
我知道我可以像这样设置并制作所有枚举以在序列化期间转换为字符串(来自枚举作为字符串的 JSON 序列化):
var jsonFormatter = config.Formatters.JsonFormatter;
jsonFormatter.SerializerSettings.Converters.Add(
new StringEnumConverter
{
CamelCaseText = true
}
);
但似乎在我尝试过的所有情况下,全局都被忽略了 Dictionary<int,List<SomeEnum>>
、Dictionary<int, SomeEnum>
、List<SomeEnum>
甚至 SomeEnum!
这是我的配置:
public static class WebApiConfig
{
//https://stackoverflow.com/questions/9847564/how-do-i-get-asp-net-web-api-to-return-json-instead-of-xml-using-chrome/20556625#20556625
private class BrowserJsonFormatter : JsonMediaTypeFormatter
{
public BrowserJsonFormatter()
{
this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
}
public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType)
{
base.SetDefaultContentHeaders(type, headers, mediaType);
headers.ContentType = new MediaTypeHeaderValue("application/json");
}
}
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Formatters.Add(new BrowserJsonFormatter());
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// DateTime Formatter
config.Formatters.JsonFormatter.SerializerSettings
.DateFormatString = "o";
// enum Formatter to String
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter());
}
}
任何帮助不胜感激!
正如@dbc所建议的那样,为以前的格式化程序放置一个config.Formatters.Clear()
并更改顺序 - 使其工作。
以下是将枚举转换为任何类型的数据结构中的字符串的最终代码:
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Formatters.Clear();
config.Formatters.Add(new BrowserJsonFormatter());
//enum formatter as strings
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter());
// DateTime Formatter
config.Formatters.JsonFormatter.SerializerSettings
.DateFormatString = "o";
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}