【发布时间】: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符号)。可以包含类似的正则表达式,例如通过patternProperties、pattern等关键字,但会比较麻烦。 -
我同意,分两步进行会容易得多。在满足您的需求的架构中会有意想不到的复杂性。
-
附加属性可以是任何东西——字符串、数字、深层对象,...。但我需要验证所有文本——甚至是属性名称。所以你可能是对的,除了模式验证之外,这更容易解决。我会追求这一点,除非有人想出一个天才模式黑客:-)
-
"propertyNames" 可以验证未指定属性的名称,并且在 draft2019-09 中添加“unevaluatedProperties”也应该使这更容易一些,强制 all 属性名称和值通过一个限制性的“ascii_string”定义。
标签: jsonschema