【问题标题】:ASP.NET core JSON model binding int to enumASP.NET 核心 JSON 模型绑定 int 到枚举
【发布时间】:2021-08-03 01:23:51
【问题描述】:

场景

我想将具有整数值的传入 JSON 请求映射到相应的枚举值。 下面的代码针对实际问题进行了简化,MyRequest 类上有更多字段。

数据代码


public enum Policy
{
    Unknown = 0,
    Policy1 = 1,
    Anticipated = 2
}

public enum Design
{
    Unknown = 0,
    Project = 1,
    Days = 2
}

public class Policies
{
    public Policy? PolicyId { get; set; } 

    public Design? DesignId { get; set; } 
}

class MyRequest
{
    public int Id { get; set; }

    public Policies Policies { get; set; }
}

JSON 请求

{
    "policies": {
        "policyId": 2,
        "designId": 2
    },
    "id": 1
}

控制器代码

[HttpPut]
public async Task<IActionResult> Put(MyRequest request)
{
    // reques.Policies.DesignId is null
    // reques.Policies.PolicyId is null
}

【问题讨论】:

    标签: enums integer asp.net-core-3.1 model-binding


    【解决方案1】:

    在深入研究该问题并且几乎没有 Microsoft 提供的文档后,我发现 this 类似的问题给了我正确的方向:实现自定义 JSONConverter

    JSON 转换器

    public class ContractConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return typeof(Policies) == objectType;
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            var rawValue = serializer.Deserialize<dynamic>(reader);
            var policyId = (Policy)(rawValue.policyId);
            var designId = (Design)(rawValue.designId);
            return new Policies(policyId, designId);
        }
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    
        public override bool CanWrite => false;
    }
    

    Startup.cs

     services.AddControllers()
                    .AddNewtonsoftJson(o=> o.SerializerSettings.Converters.Add(new ContractConverter()));
    

    【讨论】:

      猜你喜欢
      • 2017-10-03
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 2018-06-22
      • 2017-03-03
      相关资源
      最近更新 更多