如何手动反序列化 JSON 并像 Web API 那样自动验证模型?
Posted
技术标签:
【中文标题】如何手动反序列化 JSON 并像 Web API 那样自动验证模型?【英文标题】:How to manually deserialize JSON and validate model like Web API does it automatically? 【发布时间】:2021-01-24 21:07:43 【问题描述】:将 JSON 发布到 Web API 时,不仅会自动反序列化,还可以使用模型验证,如
// ItemPostRequest
class ItemPostRequest
[Required] // this will automatically be validated and errors created if it is missing
public string Description get; set;
但是,就我而言,我只有一个包含 JSON 的字符串。我可以使用 JsonSerializer.Deserialize<ItemPostRequest>(myJsonString);
对其进行反序列化,但这缺少验证。
如何使用验证/如何像 Web API 那样手动反序列化和验证 JSON?
在我的情况下,JSON 字符串是带有 file
和 json
等键的表单数据的一部分,但表单数据格式化程序只关心将表单数据拆分为键值对,它不关心关心反序列化 json 及其模型验证。所以我必须手动执行此操作 - 但如何操作?
【问题讨论】:
这能回答你的问题吗? How to force System.Text.Json serializer throw exception when property is missing? 【参考方案1】:在模型绑定器中反序列化 JSON,如下所示:https://***.com/a/49471892 然后验证将自动完成:-)
【讨论】:
【参考方案2】:也许像下面这样。我尚未对其进行测试,但您应该能够使用 TryValidateModel() 根据您的类注释(例如 [Required])手动验证您的 ItemPostRequest。
// Deserialize
var itemPostRequest = JsonSerializer.Deserialize<ItemPostRequest>(myJsonString);
// Reset just in case
ModelState.Clear();
// Manually validate the model using the annotations on the model class
TryValidateModel(itemPostRequest);
// If it fails, return error
if (!ModelState.IsValid)
return BadRequest(ModelState);
// Otherwise we're good, keep going...
【讨论】:
谢谢,这确实可能有效,但是这样做时操作方法中有很多代码。我最终使用了模型活页夹(请参阅我自己的答案)。以上是关于如何手动反序列化 JSON 并像 Web API 那样自动验证模型?的主要内容,如果未能解决你的问题,请参考以下文章
反序列化 Web.API 参数时未调用自定义 Json.NET JsonConverter
反序列化 Json usinc C#, web api, asp.net mvc