Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net core .NETCore3.x中的全局json序列化选项_.net Core_.net Core 3.1_System.text.json - Fatal编程技术网

.net core .NETCore3.x中的全局json序列化选项

.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

我有.NETCore3.1WebAPI。我正在使用
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”
。我不明白这是怎么回事。你能简单地把一个伪装者换成另一个吗?