更新
.Net 8已经发布,并且内置了对不同命名策略的支持。
var serializeOptions = new JsonSerializerOptions
{
// This can be changed to other naming policies like SnakeCaseLower, KebabCaseLower
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true
};
jsonString = JsonSerializer.Serialize(weatherForecast, serializeOptions);
旧答案
只需对 pfx 代码进行轻微修改,以消除对 Newtonsoft Json.Net
的依赖。
String
扩展方法将给定的字符串转换为 SnakeCase
。
public static class StringUtils
{
public static string ToSnakeCase(this string str)
{
return string.Concat(str.Select((x, i) => i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString())).ToLower();
}
}
然后在我们的
SnakeCaseNamingPolicy
中,我们可以这样做
public class SnakeCaseNamingPolicy : JsonNamingPolicy
{
public static SnakeCaseNamingPolicy Instance { get; } = new SnakeCaseNamingPolicy();
public override string ConvertName(string name)
{
return name.ToSnakeCase();
}
}
最后一步是在
Startup.cs
中注册我们的命名策略。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddJsonOptions(
options => {
options.JsonSerializerOptions.PropertyNamingPolicy =
SnakeCaseNamingPolicy.Instance;
});
}
使用这个模型:
public class WeatherForecast
{
public DateTime Date { get; set; }
public int TemperatureCelcius { get; set; }
public int TemperatureFahrenheit { get; set; }
public string Summary { get; set; }
}
Json
输出:
{
"date": "2019-10-28T08:26:14.878444+05:00",
"temperature_celcius": 4,
"temperature_fahrenheit": 0,
"summary": "Scorching"
}