gpt4 book ai didi

c# - 如何防止 Json.NET 将枚举转换为字符串?

转载 作者:行者123 更新时间:2023-11-30 13:26:23 27 4
gpt4 key购买 nike

下课

public class RequestSections : RequestBase
{
public RequestSections(Command c, Dictionary<SectionIdentifier, BigInteger> v) : base(c)
{
VERSIONS = v;
}

public Dictionary<SectionIdentifier, BigInteger> VERSIONS { get; set; }
}

使用 JSON.NET 序列化为 JSON 并生成以下 JSON 输出:

{
"VERSIONS": {
"Photos": 901,
"Music": 902
},
"CMD": 43
}

问题是 SectionIdentifierenum 但 JSON.NET 将它们转换为字符串。

public enum SectionIdentifier
{
Photos = 1000,
Music
}

如何防止 JSON.NET 将整数 enum 值转换为字符串?我只想看到它们的整数表示。

顺便说一句,驻留在RequestBase类中的CMD也是enum类型,但幸运的是它没有被转换为字符串。

最佳答案

JSON spec表示对象中的属性名称(键)必须是字符串。如果您有一个使用枚举值作为键的字典,Json.Net 只需对这些值调用 Convert.ToString() 即可获取 JSON 属性名称。 (这可以在 source code 中的 GetPropertyName() 方法中看到,它由 SerializeDictionary() 调用。)

可以覆盖此默认行为,以便 Json.Net 将数字枚举字典键写入 JSON(当然,仍然是字符串,以符合规范)。这可以使用自定义 ContractResolver 或自定义 JsonConverter 来完成。在这种特殊情况下,解析器方法可能会更简单一些,因此我将在此处展示。这是您需要的代码:

class CustomResolver : DefaultContractResolver
{
protected override JsonDictionaryContract CreateDictionaryContract(Type objectType)
{
var contract = base.CreateDictionaryContract(objectType);

var keyType = contract.DictionaryKeyType;
if (keyType.BaseType == typeof(Enum))
{
contract.PropertyNameResolver =
propName => ((int)Enum.Parse(keyType, propName)).ToString();
}

return contract;
}
}

要序列化,通过如下设置将自定义解析器的实例传递给序列化器:

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();

string json = JsonConvert.SerializeObject(foo, settings);

这是一个人为设计的演示来证明它的工作原理。您可以注释掉设置解析器以切换行为的行。

class Program
{
static void Main(string[] args)
{
var dict = new Dictionary<Color, string>
{
{ Color.Red, "#FF0000" },
{ Color.Green, "#00FF00" },
{ Color.Blue, "#0000FF" },
{ Color.White, "#FFFFFF" }
};

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();
settings.Formatting = Formatting.Indented;

string json = JsonConvert.SerializeObject(dict, settings);
Console.WriteLine(json);
}

enum Color { Red = 1, Green = 2, Blue = 3, White = 4 }
}

输出:

{
"1": "#FF0000",
"2": "#00FF00",
"3": "#0000FF",
"4": "#FFFFFF"
}

关于c# - 如何防止 Json.NET 将枚举转换为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24985148/

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