避免将任何数字绑定到 bool 属性

2023-11-22

我有简单的 ASP.NET Core WebApi 和模型

public class Model
{
    public bool? Value {get; set;}
}

和端点

[HttpPost]
public async Task<IActionResult> Create([FromBody] Model model)

当我用 body 发出 POST 请求时

{
   "Value" : 7676
}

or

{
   "Value" : 2955454545645645645645645645654534534540    
}

then model.Value == true

如何避免这种情况?在这种情况下我需要一些错误,因为7676不是布尔值。

I found 这个问题 and this,但解决方案不适合我,因为我在不同的项目中有很多模型(因此,很难将 JsonConverter 属性从答案添加到所有属性)

另外,我正在寻找描述此行为的任何文档。


您可以通过创建自定义 JsonConverter 来实现它。可以找到相同的文档here

这种行为的原因与 JSON.NET 或System.Text.JSON反序列化类型。由于 123 可以转换为booleantrue,反序列化成功。它根据整数值认为它是 true 或 false,直到您显式定义一个 JsonConverter(如下所示)来检查正在读取的令牌实际上是布尔值。

如果您不使用 Newtonsoft。你利用System.Text.Json您可以关注此页面创建自定义 JSON 转换器

public class OnlyBoolean : JsonConverter
{
     readonly JsonSerializer defaultSerializer = new JsonSerializer();

     public override bool CanConvert(Type objectType)
     {
         return objectType == typeof(bool);
     }

     public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
     {
         switch (reader.TokenType)
         {

             case JsonToken.Boolean:
             {
                 return defaultSerializer.Deserialize(reader, objectType);
             }
             case JsonToken.String:
             {
                 if (reader.Value?.ToString() == "true" || reader.Value?.ToString() == "false")
                      return defaultSerializer.Deserialize(reader, objectType);
                 else
                      throw new JsonSerializationException(string.Format("Token \"{0}\" of type {1} is not a boolean type", reader.Value, reader.TokenType));
            }
            case JsonToken.Integer:
            {
                if (Convert.ToInt32(reader.Value) == 1 || Convert.ToInt32(reader.Value) == 0)
                    return defaultSerializer.Deserialize(reader, objectType);
                else
                    throw new JsonSerializationException(string.Format("Token \"{0}\" of type {1} is not a boolean type", reader.Value, reader.TokenType));
            }
            default:
                      throw new JsonSerializationException(string.Format("Value\"{0}\" of type {1} is not a boolean type", reader.Value, reader.TokenType));
          }
      }

      public override bool CanWrite { get { return false; } }

      public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
      {
          throw new NotImplementedException();
      }
}

然后将你的模型装饰为:

public class Model
{
    [JsonConverter(typeof(OnlyBoolean))]
    public bool? Value {get; set;}
}

或者在启动中全局注册

services.AddMvc().AddJsonOptions(options => { options.SerializerSettings.Converters.Add(new OnlyBoolean());});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

避免将任何数字绑定到 bool 属性 的相关文章

  • Exit() 时是否调用基本对象析构函数?

    我意识到这个问题已经出现过几次 但我试图获得上述问题的明确答案 但我不断遇到相互矛盾的信息 我需要知道的是 当我使用 exit 时 基本类对象是否被破坏 我知道需要删除动态内存 但我的意思更像是 include
  • 按扩展名过滤搜索文件返回太多结果

    我正在开发一个 C 控制台应用程序 它必须管理 Windows 操作系统上的文件 我需要获取具有特定扩展名的文件名 列表 我找到了很多解决方案 最建议的是以下一种 HANDLE hFind WIN32 FIND DATA data hFin
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 如何使用 Regex.Replace 从字符串中删除数字?

    我需要使用Regex Replace从字符串中删除所有数字和符号 输入示例 123 abcd33输出示例 abcd 请尝试以下操作 var output Regex Replace input d string Empty The d标识符
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

    In my makefile我有以下目标 它将文本 HTML 资源 编译 为unsigned char数组使用xxd i http linuxcommand org man pages xxd1 html 我将结果包装在匿名命名空间和标头保
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 如何在 sql azure 上运行 aspnet_regsql? [复制]

    这个问题在这里已经有答案了 可能的重复 将 ASP NET 成员资格数据库迁移到 SQL Azure https stackoverflow com questions 10140774 migrating asp net membersh
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我

随机推荐

  • Python 和 Matlab 中的克罗内克积

    我试图从 MATLAB 中用 Python 重现结果 但是 我似乎无法正确理解 这是正确的 MATLAB 代码 nx 5 ny 7 x linspace 0 1 nx dx x 2 x 1 y linspace 0 1 ny dy y 2
  • Python:在 Windows 上启动新的命令提示符并等待其完成/退出

    我不明白为什么在 Windows 上做到这一点这么难 我想生成一堆命令提示符窗口来运行其他脚本 我想要这个的原因是这样我可以整齐地看到每个脚本的所有输出 如果我将它们只是主窗口中的线程 子进程 我无法正确查看所有输出 我也不想记录输出 因为
  • C# 拖放在 Windows 7 上不起作用

    我有一个使用 C winforms 的项目已经有一段时间了 我在windows 7发布之前就实现了拖放功能 工作起来就像一个魅力 但是 当使用 Windows 7 时 它不起作用 该事件甚至没有被触发 AllowDrop设置为 true 订
  • 无法在 Kafka Stream 应用程序的 IDE 中删除状态目录

    我正在开发一个简单的 Kafka Stream 应用程序 它从一个主题中提取消息并在转换后将其放入另一个主题中 我正在使用 Intelij 进行开发 当我调试 运行这个应用程序时 如果我的 IDE 和 Kafka 服务器位于同一台机器 即
  • 使用 JavaScript 自定义确认对话框

    我想创建一个类似于的 JavaScript 函数confirm 显示一个对话框 一个带有问题和 2 个按钮的 div 并返回true如果用户单击 确定 或false否则 是否可以使用 JavaScript jQuery 做到这一点 但是wi
  • 对绑定在一起的 NSTextField 使用 KVO

    我在使用 KVO 处理 Cocoa 应用程序中绑定在一起的文本字段时遇到问题 当使用按钮在 NSTextFields 中设置字符串时 我已经得到了这个工作 但它不适用于绑定 一如既往 我们将非常感谢 Stack Overflow 提供的任何
  • 以编程方式忽略 Cout

    有谁知道是否有一个技巧可以切换所有cout lt lt 函数不打印可见输出 我正在尝试将我和其他人编写的一些代码组合在一起以制作一个演示 我不想将输出重定向到文件 并且想要一个在 Windows 和 Linux 之间具有一定兼容性的解决方案
  • Node.js / Express 应用程序中的测试环境

    我刚刚开始使用 Node 并且一直在关注各种教程 我创建了一个 Express 应用程序 并设置了 Mongoose 和 Jasmine 我如何配置我的规格 以便我可以 创建模型 在每个规格后自动清理它们 使用不同的数据库来创建测试对象 例
  • Python 来自 Python:限制功能? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 安全 沙箱 我正在用 Python 构建一个企业 Web 系统 该系统允许上传脚本并在服务器端运行 鉴于我已经在使用 Python 进行开发 而且它是一种非常简单的语言 它似乎是一种编写
  • 如何在 Ruby on Rails 中使用映射表跟踪模型历史记录?

    dream 我想记录用户何时更改地址 这样 当下订单时 它将始终能够引用下订单时使用的用户地址 可能的图式 users id username email user addresses id label line 1 line 2 city
  • Agda 的 Haskell 推导机制

    我想知道 Agda 中是否有任何类似于 Haskell 的东西deriving Eq条款 那么我下面还有一个相关的问题 例如 假设我有一种玩具语言的类型 data Type Set where Nat Type Prp Type 然后我可以
  • 有没有办法覆盖 LINQtoSQL 生成的类中的空构造函数?

    如果我的数据库中有一个名为 Users 的表 则 LINQtoSQL 会生成一个名为 User 的类 该类具有已声明的空构造函数 如果我想重写此构造函数并向其中添加我自己的逻辑 最佳实践是什么 由 O R 设计器生成的默认构造函数调用一个名
  • 更新多行时强制转换 NULL 类型

    当我尝试同时更新多行时遇到问题 这是我使用的表和查询 为了更好的阅读而进行了简化 table CREATE TABLE foo pkid integer x integer y integer query UPDATE foo SET x
  • 实体框架代码第一个唯一列

    我正在使用 Entity Framework 4 3 并使用 Code Fist 我有课 public class User public int UserId get set public string UserName get set
  • 结构体中的 GLSL Sampler2D

    在GLSL中 当我尝试将带有sampler2D属性的统一结构传递给向前声明的函数时 似乎存在着色器的链接错误 如果我删除前向声明并将函数移至 main 之上 则代码将有效 这是非法代码吗 version 330 core in vec2 t
  • “数组作为属性参数不符合 CLS”警告,但未给出类型信息

    编译我的解决方案时 我收到以下几个警告 警告 CS3016 作为属性参数的数组不符合 CLS 没有给出有关什么类型不合规的其他信息 在我的项目中 我有一些属性params构造函数中的数组参数 但它们都是内部的 这不应该影响 CLS 合规性
  • Visual Studio 2010的奇怪“警告LNK4042”

    我刚刚被 Visual Studio 2010 C 的一些重要警告狠狠地打了一顿 编译给出以下输出 1 Debug is obj 警告 LNK4042 多次指定对象 附加内容被忽略1 Debug make obj 警告 LNK4042 多次
  • 为什么主模块的服务可以在其他模块中使用?

    我有一个主模块main其中包含一个服务mainService 然后我注入了另一个模块moduleA在我的主模块中 我随机打电话mainService in moduleA无需注射main模块并惊讶地发现它工作正常 angular modul
  • 在 swift 3 中创建复杂的 NSCompoundPredicate

    我想创建一个复杂的NS复合谓词然而 在 swift 3 中 我不知道该怎么做 假设我有 5 个谓词 p1 p2 p3 p4 p5 我想实现以下条件 compound1 p1 AND p2 AND p3 NSCompoundPredicate
  • 避免将任何数字绑定到 bool 属性

    我有简单的 ASP NET Core WebApi 和模型 public class Model public bool Value get set 和端点 HttpPost public async Task