将 Json 数组转换为枚举列表

问题描述 投票:0回答:2

我有这个 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
}

知道为什么会发生这种情况吗?

c# json .net enums
2个回答
0
投票

[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;}
}

0
投票

您遇到的问题可能源于这样一个事实: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 类以接受字符串值可能更合适。

© www.soinside.com 2019 - 2024. All rights reserved.