如何手动反序列化 JSON 并像 Web API 一样自动验证模型?

问题描述

将 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 及其模型验证。所以我必须手动执行此操作 - 但如何操作?

解决方法

也许像下面这样。我尚未对其进行测试,但您应该能够使用 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,就像这里写的:https://stackoverflow.com/a/49471892 然后验证将自动完成:-)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...