我正在使用Json.NET 7.0.1。
documentation说
在我的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
,它的ContractResolver
是null
。为什么会这样?
最佳答案
发生这种情况是因为 JsonConvert.SerializeObject
通过内部调用 JsonSerializer.CreateDefault(JsonSerializerSettings settings)
在默认设置之上应用了传入设置。我不知道是否/在哪里记录了此行为,但是在source code中可见。因此,除了本地指定的转换器的空列表之外,还将使用转换器的默认列表,这意味着将使用默认的StringEnumConverter
。
您可以通过以下两种方法解决此问题:
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());
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/