Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ajv-验证具有换行符的JSON?_Javascript_Json_Jsonschema_Ajv - Fatal编程技术网

Javascript ajv-验证具有换行符的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文档的正确方法是什么

简化示例:

  • 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字符串是没有意义的。