rapidjson schema 如何从错误中获取关键字
rapidjson schema how to get the keyword from the error
我正在制作一个物理软件,我们部署了一个 json 解决方案,我想使用 json 架构。因此,当我有一个错误的密钥时,通常在模式中看起来是一个“长度”,而用户给出了一些错误的东西,比如“length2”。我不知道怎么用rapidjson实际上,我得到了这些结果
Invalid schema: #/properties/TEST
Invalid keyword: required
Invalid document: #/TEST
但我希望缺少“length”键这样的输出,以便通知用户。
我 test.json 文件:
{
"$schema": "./schema.json",
"TEST": {
"Length2": {
"Value":20,
"Unit":"mm"
}
}
}
编辑 Ether 评论我的 schema.json 但这不会改变我的输出见“无效模式”
{
"type": "object",
"required": ["TEST"],
"properties": {
"TEST": {
"type": "object",
"required": ["Length"],
"properties": {
"Length":{
"type": "object",
"required": ["Value","Unit"],
"properties": {
"Value": {"type": "number"},
"Unit": {"type": "string"}
}
}
}
}
}
}
和我的 cpp 代码:
#include "rapidjson/document.h"
#include "rapidjson/error/en.h"
#include "rapidjson/schema.h"
#include "rapidjson/stringbuffer.h"
#include "rapidjson/filereadstream.h"
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
using namespace rapidjson;
int main()
{
char readBuffer[65536];
FILE* fp = fopen("test.json", "r");
FileReadStream is(fp, readBuffer, sizeof(readBuffer));
Document d;
d.ParseStream(is);
FILE* fp2 = fopen("schema.json", "r");
FileReadStream fs(fp2, readBuffer, sizeof(readBuffer));
Document sd;
sd.ParseStream(fs);
SchemaDocument schema(sd);
SchemaValidator validator(schema);
if(!d.Accept(validator))
{
rapidjson::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());
}
else
printf("\nJson file validated with the given schema successfully\n");
return 0;
}
在 /properties/TEST/properties
你应该有 属性 个名字,而不是模式。也许您缺少 "Length"
属性 来包含该子模式?
所以我按照 rapidjson 文件夹中的 schemavalidator.cpp 示例找到了答案。
我在这里提供了我的例子:
https://github.com/faudard/rapidjson_scheme
我使用与示例相同的“CreateErrorMessages”。
我正在制作一个物理软件,我们部署了一个 json 解决方案,我想使用 json 架构。因此,当我有一个错误的密钥时,通常在模式中看起来是一个“长度”,而用户给出了一些错误的东西,比如“length2”。我不知道怎么用rapidjson实际上,我得到了这些结果
Invalid schema: #/properties/TEST
Invalid keyword: required
Invalid document: #/TEST
但我希望缺少“length”键这样的输出,以便通知用户。
我 test.json 文件:
{
"$schema": "./schema.json",
"TEST": {
"Length2": {
"Value":20,
"Unit":"mm"
}
}
}
编辑 Ether 评论我的 schema.json 但这不会改变我的输出见“无效模式”
{
"type": "object",
"required": ["TEST"],
"properties": {
"TEST": {
"type": "object",
"required": ["Length"],
"properties": {
"Length":{
"type": "object",
"required": ["Value","Unit"],
"properties": {
"Value": {"type": "number"},
"Unit": {"type": "string"}
}
}
}
}
}
}
和我的 cpp 代码:
#include "rapidjson/document.h"
#include "rapidjson/error/en.h"
#include "rapidjson/schema.h"
#include "rapidjson/stringbuffer.h"
#include "rapidjson/filereadstream.h"
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
using namespace rapidjson;
int main()
{
char readBuffer[65536];
FILE* fp = fopen("test.json", "r");
FileReadStream is(fp, readBuffer, sizeof(readBuffer));
Document d;
d.ParseStream(is);
FILE* fp2 = fopen("schema.json", "r");
FileReadStream fs(fp2, readBuffer, sizeof(readBuffer));
Document sd;
sd.ParseStream(fs);
SchemaDocument schema(sd);
SchemaValidator validator(schema);
if(!d.Accept(validator))
{
rapidjson::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());
}
else
printf("\nJson file validated with the given schema successfully\n");
return 0;
}
在 /properties/TEST/properties
你应该有 属性 个名字,而不是模式。也许您缺少 "Length"
属性 来包含该子模式?
所以我按照 rapidjson 文件夹中的 schemavalidator.cpp 示例找到了答案。 我在这里提供了我的例子: https://github.com/faudard/rapidjson_scheme 我使用与示例相同的“CreateErrorMessages”。