.net core .NETCore3.x中的全局json序列化选项
我有.NETCore3.1WebAPI。我正在使用.net core .NETCore3.x中的全局json序列化选项,.net-core,.net-core-3.1,system.text.json,.net Core,.net Core 3.1,System.text.json,我有.NETCore3.1WebAPI。我正在使用System.Text.Jsonserializer,因为它已成为.NETCore3.x应用程序的默认值。我已将全局枚举设置为字符串转换器,如下所示: public void ConfigureServices(IServiceCollection services) { ... services.AddControllers() .AddJsonOptions(option
System.Text.Json
serializer,因为它已成为.NETCore3.x应用程序的默认值。我已将全局枚举设置为字符串转换器,如下所示:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddControllers()
.AddJsonOptions(options =>
options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter())));
...
}
枚举被转换为控制器响应的字符串(这很有意义,因为我在AddControllers()
方法上进行了配置)。但如果我尝试手动序列化一个对象,它仍将枚举序列化为int。示例如下:
public class TestClass
{
public void Test()
{
var data = JsonSerializer.Serialize(new MyObject { Enum1 = MyEnum.Value1, Enum2 = MyEnum.Value2 });
}
public class MyObject
{
public MyEnum Enum1 { get; set; }
public MyEnum Enum2 { get; set; }
}
public enum MyEnum
{
Value1 = 1,
Value2 = 2
}
}
输出:
data [string]: "{\"Enum1\":1,\"Enum2\":2}"
如果手动添加转换属性,则它会根据需要序列化:
public class MyObject
{
[JsonConverter(typeof(JsonStringEnumConverter))]
public MyEnum Enum1 { get; set; }
public MyEnum Enum2 { get; set; }
}
输出
data [string]: "{\"Enum1\":\"Value1\",\"Enum2\":2}"
有没有一种方法可以设置全局json序列化选项(从枚举到字符串的转换),从而也适用于手动序列化
或者我应该一直坚持使用显式属性?目前你不能
JsonSerializer
是一个静态类,只有纯静态方法,无法设置默认选项。你可以检查一下。它似乎是为了更好的性能而设计的
或者,您可以创建自己的静态类
公共静态类CustomJsonSerializer
{
私有静态JsonSerializerOptions序列化设置=
新的JsonSerializerOptions{/*无论您需要什么*/};
公共静态T反序列化(此字符串为json)
{
返回JsonSerializer.Deserialize(json,serializerSettings);
}
//等等。
}
我通过添加NewtonsoftJson
然后注册StringEnumConverter
实现了这一点:
services
.AddControllers(jsonOptions => jsonOptions.ReturnHttpNotAcceptable = true)
.AddNewtonsoftJson(jsonOptions =>
{
jsonOptions.SerializerSettings.Converters.Add((JsonConverter) new StringEnumConverter());
}
我从您的示例中得到以下错误:
无法将类型“Newtonsoft.Json.Converters.StringEnumConverter”转换为“System.Text.Json.Serialization.JsonConverter”
。我不明白这是怎么回事。你能简单地把一个伪装者换成另一个吗?