如何手动反序列化 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 字符串是带有 filejson 等键的表单数据的一部分,但表单数据格式化程序只关心将表单数据拆分为键值对,它不关心关心反序列化 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

Unity Json反/序列化嵌套数据[重复]

反序列化 Json usinc C#, web api, asp.net mvc

在 Web Api 控制器中将 JSON 反序列化为字典

在 Asp.Net Web API 中将 JSON 反序列化为派生类型

Ktor:如何序列化/反序列化 JSON-API (vnd.api+json)