我有一个类,它将使用 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;
}
};
任何人都可以帮助我们如何满足我的要求。
您需要同时保留
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} {}