我有这个 json 有效负载,它是我的控制器 DTO 所期望的,名为 OperationSystemDTO
{
"Status": true,
"SubscriptionSystems": [
"1", "3"
]
}
我的控制器:
[HttpPost(nameof(Validate))]
[SwaggerOperation(nameof(Validate))]
public async Task<ActionResult> Validate([FromBody] OperationSystemDTO dto)
但是当我将此有效负载发布到我的控制器时,我的 DTO 始终是
null
,我注意到这是因为这个枚举列表。我尝试用 [JsonConverter(typeof(JsonStringEnumConverter))]
注释来转换它,但根本没有效果。
public class OperationSystemDTO
{
public bool Status {get; set;}
public List<SubscriptionSystem> SubscriptionSystems {get; set;}
}
public enum SubscriptionSystem {
SYS_1 = 1,
SYS_2 = 2,
SYS_3 = 3
}
知道为什么会发生这种情况吗?
[JsonConverter(typeof(JsonStringEnumConverter))]
属性是转换单个enum
属性。对于 enum
的集合,您可以使用 [JsonProperty(ItemConverterType=typeof(JsonStringEnumConverter))]
,如下所示:
public class OperationSystemDTO
{
public bool Status {get; set;}
[JsonConverter(typeof(JsonStringEnumConverter))]
public SubscriptionSystem SingleSubscriptionSystem { get; set; }
[JsonProperty(ItemConverterType = typeof(JsonStringEnumConverter))]
public List<SubscriptionSystem> SubscriptionSystems {get; set;}
}
您遇到的问题可能源于这样一个事实:JSON 有效负载包含 SubscriptionSystems 数组的字符串值,但您的 OperationSystemDTO 类需要枚举值。要解决此问题,您需要修改 JSON 有效负载以包含枚举值或调整 DTO 类以接受字符串值。
以下是两种可能的解决方案:
调整 DTO 类以接受字符串值:将
SubscriptionSystems
类中的 OperationSystemDTO
属性修改为 List<string>
类型,而不是 List<SubscriptionSystem>
类型。然后,您可以根据需要手动将字符串值转换为枚举值。
public class OperationSystemDTO
{
public bool Status { get; set; }
public List<string> SubscriptionSystems { get; set; }
}
修改 JSON 负载以包含枚举值:如果您可以控制 JSON 负载,则可以修改它以包含枚举值,而不是 SubscriptionSystems 数组的字符串值。
{
"Status": true,
"SubscriptionSystems": [
"SYS_1", "SYS_3"
]
}
使用此 JSON 有效负载,您现有的
OperationSystemDTO
类应该能够正确反序列化它。
选择最适合您的要求和限制的解决方案。如果您可以控制 JSON 有效负载,则将其修改为包含枚举值可能是更干净的解决方案。但是,如果您需要使用现有的 JSON 有效负载结构,调整 DTO 类以接受字符串值可能更合适。