繁体   English   中英

反序列化json时如何避免ModelState中的无效错误

[英]How to avoid invalid error in ModelState when deserializing a json

我正在用 C# 编写一个 API 控制器。 我正在利用 ModelState 进行模型验证。 例如,检查字符串字段的长度,或检查 int 字段是否超过最大值。

但是我发现了一个问题,有时它不能按预期工作。 例如,这里我有一个包含两个字段的模型:

public int A { get; set; }
public bool B { get; set; }

然后我的请求有效负载如下所示:

{
   "A": 123.4,
   "B": true
}

显然 A 的格式无效,它应该是 int 但我给了它一个浮点数。 所以我在 ModelState 中得到一个错误: Input string '123.4' is not a valid integer. Path 'A', line x, position x. Input string '123.4' is not a valid integer. Path 'A', line x, position x. . 这完全有道理。

但同时在 ModelState 中出现另一个错误: Unexpected token when deserializing object: Boolean. Path 'B', line x, position x.出现Unexpected token when deserializing object: Boolean. Path 'B', line x, position x. Unexpected token when deserializing object: Boolean. Path 'B', line x, position x. .

似乎当 A 不是 int 时,C# 在反序列化 json 的其余部分时会出错。 我怎么能避免这种情况? 我希望 ModelState 中只有第一个错误。

谢谢你们!

- - - - - - - - - - - - - - - 编辑 - - - - - - - - - - -------------

非常感谢您的帮助。 我想在这里添加一些评论。 当然,我使用ModelState.IsValid来检查有效负载是否有效。 结果是假的。 哪个是正确的。 但是这里的错误是,只有第一个字段 A 无效,而 B 有效。 所以我希望在 ModelState 中只有 A 的错误。

如果 ModelState.IsValid 无法正常工作,您可以尝试这种方式:

private int _a;
public int A
{
    get
    {
        return _a;
    }
    set
    {
        bool success = Int32.TryParse(value.ToString(), out int number);
        if (success)
        {
            _a = number;
        }

    }
}

如果不使用 .net core 3,则只需声明 int number; 在 try 解析上方并从那里删除 int

int number

bool success = Int32.TryParse(value.ToString(), out number); 如果(成功){ _a = 数字; }

为了检查有效性(无论是一个属性还是所有属性),我一直使用以下 if 语句。 这通常涵盖具有 1 个或多个错误的请求并返回 BadRequest 状态。

if (!ModelState.IsValid)
{
   return BadRequest(ModelState);
}

如果您有兴趣运行测试并确保所有属性都正确,我可以建议使用TestController类型的类来验证数据。

阅读此处了解有关如何设置的详细信息。 这里有很多例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM