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”。