gpt4 book ai didi

c# - Json.NET 即使使用默认设置也将枚举序列化为字符串

转载 作者:太空狗 更新时间:2023-10-29 23:06:39 26 4
gpt4 key购买 nike

我正在使用 Json.NET 7.0.1。

documentation

Enum [is serialized as] Integer (can be the enum value name with StringEnumConverter)

在我的 Global.asax.cs 中,我指定了如下默认设置:

JsonConvert.DefaultSettings = (() =>
{
var settings = new JsonSerializerSettings();
settings.Converters.Add(new StringEnumConverter());
return settings;
});

但是,在某些情况下,我希望将 Enums 序列化为整数,例如当我构建一个要存储在数据库中的 JSON 时。

这是我的做法:

public class JsonSerializedType<T> : IUserType where T : class
{
private static readonly JsonSerializerSettings serializerSettings = new JsonSerializerSettings();

public void NullSafeSet(IDbCommand cmd, object value, int index)
{
cmd.Parameters[index].Value = JsonConvert.SerializeObject(value as T, serializerSettings);
}
}

但是,即使在这种情况下,Enums 也会被序列化为字符串。我检查过 serializerSettings 没有 Converters 并且它的 ContractResolvernull

为什么会这样?

最佳答案

发生这种情况是因为 JsonConvert.SerializeObject通过内部调用 JsonSerializer.CreateDefault(JsonSerializerSettings settings) 应用传入设置在默认设置之上 .我不知道是否/在何处记录了此行为,但它在 source code 中可见.因此,除了本地指定转换器的空列表外,还将使用默认的转换器列表,这意味着将使用默认的 StringEnumConverter

您有几个选项可以解决此问题:

  1. Construct the JsonSerializer yourself不使用默认设置:

    public static class JsonExtensions
    {
    public static string SerializeObjectNoDefaultSettings(object value, Formatting formatting, JsonSerializerSettings settings)
    {
    var jsonSerializer = JsonSerializer.Create(settings);
    jsonSerializer.Formatting = formatting;

    StringBuilder sb = new StringBuilder(256);
    StringWriter sw = new StringWriter(sb, CultureInfo.InvariantCulture);
    using (JsonTextWriter jsonWriter = new JsonTextWriter(sw))
    {
    jsonWriter.Formatting = jsonSerializer.Formatting;
    jsonSerializer.Serialize(jsonWriter, value);
    }

    return sw.ToString();
    }
    }

    然后像这样使用它:

    var json = JsonExtensions.SerializeObjectNoDefaultSettings(value, Formatting.None, new JsonSerializerSettings());
  2. 将默认的 StringEnumConverter 替换为将枚举序列化为字符串,例如:

    public class IntegerEnumConverter : StringEnumConverter
    {
    public override bool CanRead { get { return false; } }

    public override bool CanWrite { get { return false; } }
    }

    然后像这样使用它:

    var json = JsonConvert.SerializeObject(value, Formatting.None, new JsonSerializerSettings { Converters = new JsonConverter[] { new IntegerEnumConverter() } });

    将优先选择本地指定的转换器而不是默认转换器。

暂时取消 JsonConvert.DefaultSettings这将是一个坏主意,因为它不是线程安全的。

关于c# - Json.NET 即使使用默认设置也将枚举序列化为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31296470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com