【问题标题】:Decimal precision in JSON SchemaJSON Schema 中的小数精度
【发布时间】:2023-04-04 13:32:01
【问题描述】:

我想让我的 JSON 架构验证发送到我的 REST api 的小数点不超过两位。

据我所知,最新的 JSON Schema RFC (v4) 不允许这样做。 V1 有一个 maxDecimals 验证器。

有谁知道为什么要取出来吗?

当我将它存储在数据库中时,我有一个只包含两位小数的字段,而且我不只是想四舍五入到两位小数。对于某些用户来说,这将极大地改变输入。所以我想拒绝任何更高的精度,并强迫他们自我圆整。

我当然可以使用我自己编写的自定义验证器来执行此操作,但我宁愿不这样做,除非我绝对必须这样做。

在 v4 中是否有另一种表示方式?

谢谢

【问题讨论】:

    标签: json rest jsonschema


    【解决方案1】:

    他们将其替换为 multipleOf(通过 v3 divisibleBy)。

    对于 2 位小数,只需添加 multipleOf: 0.01。

    【讨论】:

    • 嗯...然后不接受整数。整数 5 不能被 0.01 整除。
    • 那么你可能使用了错误的 json-schema 验证器。您使用了哪个验证器,您使用的是 v3 divisibleBy 还是 v4 multipleOf?
    • json-schema-validator.herokuapp.com 上试试这个 Schema: { "type": "integer", "multipleOf": 0.01 } Data: 5
    • 我使用 Newtonsoft.Json for .NET,它只支持 v3。您在示例中给出的架构应该是 { "type": "number", "multipleOf": 0.01 } 也允许 5.12。当我阅读 NewtonSoft 的文档和单元测试时,它的行为符合预期。
    • 由于浮点不精确,这是不可靠的,例如147.41 将通过验证,但 147.42 不会 github.com/geraintluff/tv4/issues/158
    【解决方案2】:

    我建议{ "type": "number", "multipleOf": 0.01 } rather than { "type": "integer", "multipleOf": 0.01 }

    http://spacetelescope.github.io/understanding-json-schema/reference/numeric.html#multiples

    【讨论】:

      【解决方案3】:

      基于JSON Schema specification rfc.section.6.3:

      { 
        "type": "string", 
        "pattern": "-?^\\d*(.\\d{0,2})?$" 
      }
      

      【讨论】:

      • 我认为您的正则表达式将允许 42. 作为值:捕获组允许点后的零位小数。我认为,当给出(可选)组时,点后至少应该有一位小数,所以我会选择-?^\\d*(.\\d{1,2})?$
      【解决方案4】:

      如果你使用 python jsonschema 库而不是你需要的

      { "type": "number", "multipleOfPrecision": 0.01 }
      

      https://github.com/epoberezkin/ajv#options

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-08
        • 1970-01-01
        • 1970-01-01
        • 2017-04-05
        • 1970-01-01
        • 2013-07-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多