如何在类中制作rapidjson::SchemaValidator变量

问题描述 投票:0回答:1

我有一个类,它将使用 json 模式验证 json 数据

const char *ptr = R"(
    {
    "type":"object",
    "properties":{
    "name":{"type":"string"}
    },
    "required":["name"]
    }
    )";
const char *data = R"(
    {
    "name":"12"
    }
    )";
class Test {
   public:
    bool validate(Document &doc) {
        Document sdoc;
        sdoc.Parse(ptr);
        RAPIDJSON_ASSERT(!sdoc.HasParseError());
        SchemaDocument schema(sdoc);
        SchemaValidator validator(schema);
        if (doc.Accept(validator))
            return true;
        else
            return false;
    }
};

这段代码工作正常,但根据我的要求,我不需要在需要时一次又一次地创建验证器,我觉得如果验证器位于类成员内部,那么我们可以减少时间

class Test {
    SchemaValidator validator;

   public:
    bool validate(Document &doc) {
        if (doc.Accept(validator))
            return true;
        else
            return false;
    }
};

任何人都可以帮助我们如何满足我的要求。

c++ schema rapidjson
1个回答
0
投票

您需要同时保留

rapidjson::SchemaDocument
rapidjson::SchemaValidator
作为您的成员字段,因为
SchemaValidator
将非拥有指针保留到
SchemaDocument
。像这样:

class Test2 {
public:
    Test2()
        : _schema{[]() {
            rapidjson::Document sdoc;
            sdoc.Parse(ptr);
            if (sdoc.HasParseError()) {
                throw std::runtime_error("Bad schema");
            }
            return rapidjson::SchemaDocument(sdoc);
        }()}
        , _validator{_schema} {}
    bool validate(rapidjson::Document &doc) {
        if (doc.Accept(_validator))
            return true;
        else
            return false;
    }

private:
    rapidjson::SchemaDocument _schema;
    rapidjson::SchemaValidator _validator;
};

然后为了更清晰,你可以让你的类在构造函数中接受

std::string
模式

    Test2(std::string schema)
        : _schema{[schema]() {
            rapidjson::Document sdoc;
            sdoc.Parse(schema.c_str());
            if (sdoc.HasParseError()) {
                throw std::runtime_error("Bad schema");
            }
            return rapidjson::SchemaDocument(sdoc);
        }()}
        , _validator{_schema} {}
© www.soinside.com 2019 - 2024. All rights reserved.