问题描述
场景
我想将具有整数值的传入 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
}
解决方法
在深入研究问题之后,并且几乎微软没有文档,我发现了 this 类似的问题,它给了我正确的方向:实现自定义 JSONConverter
。 >
JSONConverter
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()));