【发布时间】:2014-09-22 08:51:04
【问题描述】:
我正在使用第 3 方 REST API,其中一个字段(类型 string)具有一组已知值,我在我的代码中将其建模为 enum。 JSON.NET 中的StringEnumConverter 正确序列化了除[EnumMemberAttribute] 注释中描述的这些值之一之外的所有值。特别是对于这个字段,REST API 将null 值转换为第 3 方系统中的“系统默认值”;但是,当 JSON.NET 序列化它时,它使用成员名称而不是注释中描述的值。我知道我可以编写一个自定义转换器来处理这个问题,但我的问题是,是否有一种方法可以在没有它的情况下让它工作,因为它只是 null 值不能正确序列化?
我在代码中定义的enum:
[JsonConverter(typeof(StringEnumConverter))]
public enum InitialScanLevel
{
[EnumMember(Value = null)]
SystemDefault,
[EnumMember(Value = "0")]
ModelDeviceOnly,
[EnumMember(Value = "1")]
InitialAppPopulation,
[EnumMember(Value = "2")]
DiscoverSslCerts,
[EnumMember(Value = "3")]
DiscoverOpenPorts,
[EnumMember(Value = "4")]
AdvancedPortDiscovery,
[EnumMember(Value = "5")]
DeepDiscovery
}
对于InitialScanLevel.SystemDefault,生成的 JSON 是(不是第 3 方 API 所期望的)
{
other fields...,
"initialScanLevel":"SystemDefault",
other fields...
}
但应该是
{
other fields...,
"initialScanLevel":null,
other fields...
}
对于InitialScanLevel.DeepDiscovery,生成的 JSON 是(这是第 3 方 API 所期望的)
{
other fields...,
"initialScanLevel":"5",
other fields...
}
【问题讨论】:
-
@Jashaszun 感谢您的编辑。我没有意识到 ` 会正确突出显示这些内容。
-
随时! :) 顺便说一句,您可能应该通读formatting help。那里可能有很多值得了解的信息花絮(当然其中有一些我可能能够使用但不知道用于我的其他帖子的东西)。
-
会的。再次感谢!
-
这种行为的原因是 WriteJson 方法 StringEnumConverter 做了
string enumName = e.ToString();。幸运的是,您可以从 StringEnumConverter 派生您自己的 Converter 并覆盖 WriteJson(可能还有 ReadJson)方法。您需要在那里实现 EnumMember 值(或相应的 JSON 值)为空的所需行为。 -
@elgonzo 我认为这可能是解决方案,但乐观地认为可能有一种方法可以通过注释来实现这一点......谢谢。