【问题标题】:Validate that json only contains ascii characters using json schema使用 json 模式验证 json 仅包含 ascii 字符
【发布时间】:2020-05-27 09:07:27
【问题描述】:

我们正在与硬件设备交互,我们正在上传 json 配置文件。 该设备无法处理 json 上任何地方的非 ascii 字符 - 即使转义使用 \uXXXX 也不能。

我们已经在使用 draft-07 进行架构验证,因此我们想在架构中指定此约束。 我们可以对所有字符串设置正则表达式约束。

但问题是我们必须在几个地方有additionalProperties: true - 并且附加属性必须允许任何 json 值。但我们还必须将它们限制为仅包含 ascii 字符。

这可以在架构中指定吗?

示例简化架构:

{
   "$schema":"http://json-schema.org/draft-07/schema#",
   "type":"object",
   "properties":
   {
      "channel":
      {
        "type":"array",
        "items":
         {
            "type":"object",
            "properties":  { "name":{"type":"string"} },
             "required":["name"],
            "additionalProperties":true
         }
      }
   },
   "required":["channels"],
   "additionalProperties":true
}

不应验证的示例 json:

{
  "channels":[ {"name":"temperature", "input": "temp in °C"}],
  "other":[ {"mykey": "ü"}],
  "danish": "æøå"
}

【问题讨论】:

  • 感谢更新示例。鉴于您需要深入进行检查,这有点棘手。未知属性的所有值都应该是字符串还是对象(或两者之一)?是否只是,如果它们在任何地方包含任何字符串,它们只需要是 ascii 吗?
  • 分两个单独的步骤可能更容易做到这一点。逐个符号地处理传入数据,因为它们在 ASCII 字符集中和模式验证中。如果你有一个字符串中的全部数据,一个简单的正则表达式就可以了(这里要求:stackoverflow.com/q/3203190/5127499——基本上[^ -~]会告诉你是否有任何非ASCII符号)。可以包含类似的正则表达式,例如通过patternPropertiespattern等关键字,但会比较麻烦。
  • 我同意,分两步进行会容易得多。在满足您的需求的架构中会有意想不到的复杂性。
  • 附加属性可以是任何东西——字符串、数字、深层对象,...。但我需要验证所有文本——甚至是属性名称。所以你可能是对的,除了模式验证之外,这更容易解决。我会追求这一点,除非有人想出一个天才模式黑客:-)
  • "propertyNames" 可以验证未指定属性的名称,并且在 draft2019-09 中添加“unevaluatedProperties”也应该使这更容易一些,强制 all 属性名称和值通过一个限制性的“ascii_string”定义。

标签: jsonschema


【解决方案1】:

additionalProperties 的值本身就是一个 JSON 模式(布尔值也是一个 JSON 模式!)。

如果您将additionalProperties 的值设置为与您的其他属性类似的值,它将应用于所有其他属性。

如果您需要示例,请提供我可以使用的示例架构,我很乐意展示。

【讨论】:

  • 我添加了一个示例
猜你喜欢
  • 2020-07-02
  • 1970-01-01
  • 2020-03-29
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 2019-12-14
相关资源
最近更新 更多