rapidjson Schema

本系列文章以例子的方式进行呈现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
* JsonSchema本质上是一个json,其作用是用于校验Json,使用schema对json进行校验,
* 可以让代码安全的去当问DOM,而不需要去检查类型或者键值的存在等等。这也能确保输
* 出的json符合特定的schema。
*/
#include "rapidjson/schema.h"
#include "rapidjson/stringbuffer.h"
#include <stdio.h>
#include <string>
#include <string.h>
using namespace std;
using namespace rapidjson;
/*使用JsonSchema校校验json格式的流程:
* 1. 将schema(模板)解析成一个Document
* 2. 然后将Document编译成一个SchemaDocument
* 3. 通过上述SchemaDocument创建一个SchemaValidator。
* 4. 然后通过document.Accept(validator)去校验一个json,获取校验结果。
*注意:
* 1. 一个SchemaDocument能被多个SchemaValidator引用,他不会被SchemaValidator修改。
* 2. 可以重复使用SchemaValidator校验多个文件。在校验其他文件之前,必须先调用validator.Reset()。
*JsonSchema的格式:
* 1. JsonSchema实质上是一个json数据。
* 2. JsonSchema与其他json数据不同的是它在每一个对象和元素中定义了他们的类型type,属性(如object的properties,以及integer的minimum等等),
* 同时,我们可以通过JsonSchema对json的值的类型以及取值范围等进行限定。schema中必须的值需要显示的声明在required中。
*/
bool ValidateJson() {
string testSchema = "{\"type\":\"object\", \"properties\":{\"code\":{\"type\":\"string\"}, \"int\":{\"type\":\"integer\", \"minimum\":0}}, \"required\":[\"int\",\"code\"]}";
Document sd;
if (sd.Parse(testSchema.c_str()).HasParseError()) {
printf("jsonSchema is not valid : %s", testSchema.c_str());
return false;
}
//创建SchemaDocument
SchemaDocument schema(sd);
Document d;
if (d.Parse("{\"code\":123, \"int\":1}").HasParseError()) {
printf("Document is not a valid json");
return false;
}
SchemaValidator validator(schema);
if (!d.Accept(validator)) {
StringBuffer sb;
validator.GetInvalidSchemaPointer().StringifyUriFragment(sb);
printf("Invalid schema: %s\n", sb.GetString());
printf("Invalid keyword: %s\n", validator.GetInvalidSchemaKeyword());
sb.Clear();
validator.GetInvalidDocumentPointer().StringifyUriFragment(sb);
printf("Invalid document:%s\n ", sb.GetString());
return false;
} else {
printf("符合schemas模式\n");
return true;
}
}
int main() {
ValidateJson();
}