有人需要将 JSON 文件发送到我的 ASP.NET Web 应用程序,代表一个 Microsoft.Graph.Beta.Models.ImportedDeviceIdentity。
这是我的控制器操作:
[Consumes("application/json")]
public IActionResult HandleImportDeviceIdentity([FromBody] Microsoft.Graph.Beta.Models.ImportedDeviceIdentity importDeviceIdentity)
{
...
return Ok();
}
我将 MSGraphSDKDotNet v5 与 ASP.NET (.NET Core 7) 结合使用。
如果我发送这样的 JSON 文件:
{
"importedDeviceIdentityType": "serialNumber",
"importedDeviceIdentifier": "TEST9999",
"description": "TEST999"
}
...那么我的 importDeviceIdentity 对象未正确初始化(它被设置为 null)。
但是如果我使用 importedDeviceIdentityType 枚举的数值,例如:
{
"importedDeviceIdentityType": 2,
"importedDeviceIdentifier": "TEST9999",
"description": "TEST999"
}
...一切正常。
我无法理解为什么 ASP.Net 无法将 Enum 字符串表示形式绑定到整数值,即使 ImportedDeviceIdentity 对象继承自 IParsable。
我不想编写自定义 JSON 转换器,也不想使用廉价的解决方案,例如绑定到字符串并使用对象方法进行反序列化(CreateFromDiscriminatorValue 和 Co...)
似乎我在 Enum 上缺少类似 [JsonConverter(typeof(JsonStringEnumConverter))] 的东西,但由于该类不是我自己定义的,所以我不能这样做。我的控制器将收到的有效负载上也没有“@odata.type”属性(不确定这是否相关)。
如何在模型绑定步骤中正确转换字符串表示形式?
默认情况下,枚举被序列化为数字。要将枚举名称序列化为字符串,请使用
JsonStringEnumConverter
。
在 Program.cs 中全局注册它,如下所示:
builder.Services.AddControllersWithViews().AddJsonOptions(opts =>
{
var enumConverter = new JsonStringEnumConverter();
opts.JsonSerializerOptions.Converters.Add(enumConverter);
});