Javascript ajv-验证具有换行符的JSON?
使用包含换行符的值验证JSON文档的正确方法是什么 简化示例:Javascript ajv-验证具有换行符的JSON?,javascript,json,jsonschema,ajv,Javascript,Json,Jsonschema,Ajv,使用包含换行符的值验证JSON文档的正确方法是什么 简化示例: JSON模式定义了一个文档,该文档具有一个名为key的属性,该属性接受字符串值(该模式是通过向提交{“key”:“value”}来推断的) JavaScript对象使用JSON.stringify()进行序列化。因此,诸如\n之类的换行符将被转义,即\\n 调用Ajv函数来验证序列化字符串 片段: // JSON schema definition const schema = { "definitions": {},
- JSON模式定义了一个文档,该文档具有一个名为
的属性,该属性接受key
值(该模式是通过向提交字符串
来推断的){“key”:“value”}
- JavaScript对象使用
进行序列化。因此,诸如JSON.stringify()
之类的换行符将被转义,即\n
\\n
- 调用Ajv函数来验证序列化字符串
// JSON schema definition
const schema = {
"definitions": {},
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "http://example.com/root.json",
"type": "object",
"title": "The Root Schema",
"required": [
"key"
],
"properties": {
"key": {
"$id": "#/properties/key",
"type": "string",
"title": "The Key Schema",
"default": "",
"examples": [
"value"
],
"pattern": "^(.*)$"
}
}
};
// a JavaScript object that has a line break
const data = { key: 'a string\nwith a line break' };
// serialize to JSON
const json = JSON.stringify(data);
// json === "{\"key\":\"a string\\nwith a line break\"}"
// validate
const Ajv = require('ajv');
const ajv = new Ajv();
const valid = ajv.validate(schema, json);
// print results
console.info('Valid:', valid);
console.info('Errors:', ajv.errors);
我原以为这会起作用,但事实证明,在执行过程中验证失败:
Valid: false
Errors: [
{
keyword: 'type',
dataPath: '',
schemaPath: '#/type',
params: { type: 'object' },
message: 'should be object'
}
]
据我理解,这是因为json
是一个字符串
,而模式定义规定它应该是一个对象
我还尝试反序列化JSON字符串,例如ajv.validate(schema,JSON.parse(JSON))代码>,但它也会失败:
Valid: false
Errors: [
{
keyword: 'pattern',
dataPath: '.key',
schemaPath: '#/properties/key/pattern',
params: { pattern: '^(.*)$' },
message: 'should match pattern "^(.*)$"'
}
]
这是有意义的,因为JSON.parse()
返回一个非JSON的JavaScript对象(例如,键不被引用,重要的是,对于这个问题,字符串值带有unscaped\n
字符)
依赖性:ajv 6.10.0我发现我使用了错误的正则表达式模式<代码>
匹配除换行符以外的任何字符。为了解决这个问题,我将模式更改为[\s\s]
,其中\s
字符类与“任意空白字符”匹配,\s
字符类是其否定形式,“任意非空白字符”。此外,由于模式是在JavaScript对象的值中定义的,因此\s
和\s
中的反斜杠也需要转义,即[\\s]
。因此,模式定义应如下所示:
const schema = {
"definitions": {},
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "http://example.com/root.json",
"type": "object",
"title": "The Root Schema",
"required": [
"key"
],
"properties": {
"key": {
"$id": "#/properties/key",
"type": "string",
"title": "The Key Schema",
"default": "",
"examples": [
"value"
],
"pattern": "^([\\s\\S]*)$"
}
}
};
另请参见,我发现我使用了错误的正则表达式模式<代码>匹配除换行符以外的任何字符。为了解决这个问题,我将模式更改为
[\s\s]
,其中\s
字符类与“任意空白字符”匹配,\s
字符类是其否定形式,“任意非空白字符”。此外,由于模式是在JavaScript对象的值中定义的,因此\s
和\s
中的反斜杠也需要转义,即[\\s]
。因此,模式定义应如下所示:
const schema = {
"definitions": {},
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "http://example.com/root.json",
"type": "object",
"title": "The Root Schema",
"required": [
"key"
],
"properties": {
"key": {
"$id": "#/properties/key",
"type": "string",
"title": "The Key Schema",
"default": "",
"examples": [
"value"
],
"pattern": "^([\\s\\S]*)$"
}
}
};
另请参见和@Pointy:也许吧,但是我看不出我做错了什么。你能详细解释一下吗?我真的不确定;我当然不明白为什么“模式”测试会失败。验证库不能验证JSON字符串是没有意义的。@Pointy:也许吧,但是我看不出我做错了什么。你能详细解释一下吗?我真的不确定;我当然不明白为什么“模式”测试会失败。验证库不能验证JSON字符串是没有意义的。