Visindigo::Utility::JsonConfig Class
class Visindigo::Utility::JsonConfigJsonConfig定义了对Json配置的操作. 详情...
| 头文件: | #include <JsonConfig> |
| 自以下版本: | Visindigo 0.10.0 |
公开成员函数
(自 Visindigo 0.13.0 引入) | JsonConfig() |
(自 Visindigo 0.13.0 引入) | JsonConfig(const QJsonDocument &json) |
(自 Visindigo 0.13.0 引入) | JsonConfig(const QString &jsonStr) |
(自 Visindigo 0.13.0 引入) | JsonConfig(const QVariant &variant) |
(自 Visindigo 0.13.0 引入) | JsonConfig(const Visindigo::Utility::JsonConfig &other) |
(自 Visindigo 0.13.0 引入) | JsonConfig(Visindigo::Utility::JsonConfig &&other) |
(自 Visindigo 0.13.0 引入) | ~JsonConfig() |
(自 Visindigo 0.13.0 引入) void | clear() |
(自 Visindigo 0.13.0 引入) bool | contains(const QString &key) const |
(自 Visindigo 0.13.0 引入) QList<Visindigo::Utility::JsonConfig> | getArray(const QString &key = "", bool *ok = nullptr) const |
(自 Visindigo 0.13.0 引入) bool | getBool(const QString &key = "", bool *ok = nullptr) const |
(自 Visindigo 0.13.0 引入) double | getDouble(const QString &key = "", bool *ok = nullptr) const |
(自 Visindigo 0.14.0 引入) QList<double> | getDoubleArray(const QString &key = "", bool *ok = nullptr) const |
(自 Visindigo 0.13.0 引入) qint64 | getInt(const QString &key = "", bool *ok = nullptr) const |
(自 Visindigo 0.14.0 引入) QList<qint64> | getIntArray(const QString &key = "", bool *ok = nullptr) const |
(自 Visindigo 0.13.0 引入) Visindigo::Utility::JsonConfig | getObject(const QString &key = "", bool *ok = nullptr) const |
(自 Visindigo 0.13.0 引入) QString | getString(const QString &key = "", bool *ok = nullptr) const |
(自 Visindigo 0.13.0 引入) QStringList | getStringList(const QString &key = "", bool *ok = nullptr) const |
(自 Visindigo 0.13.0 引入) QJsonValue | getValue(const QString &key = "", bool *ok = nullptr) const |
(自 Visindigo 0.13.0 引入) bool | isArray(const QString &key = "") const |
(自 Visindigo 0.13.0 引入) bool | isBool(const QString &key = "") const |
(自 Visindigo 0.13.0 引入) bool | isDouble(const QString &key = "") const |
(自 Visindigo 0.13.0 引入) bool | isEmpty(const QString &key = "") const |
(自 Visindigo 0.13.0 引入) bool | isInt(const QString &key = "") const |
(自 Visindigo 0.13.0 引入) bool | isNull(const QString &key = "") const |
(自 Visindigo 0.13.0 引入) bool | isObject(const QString &key = "") const |
(自 Visindigo 0.13.0 引入) bool | isString(const QString &key = "") const |
(自 Visindigo 0.13.0 引入) QStringList | keys(const QString &key = "") const |
(自 Visindigo 0.13.0 引入) QJsonParseError | parse(const QString &jsonStr) |
(自 Visindigo 0.13.0 引入) bool | remove(const QString &key) |
(自 Visindigo 0.13.0 引入) void | setArray(const QString &key, const QList<Visindigo::Utility::JsonConfig> &value) |
(自 Visindigo 0.13.0 引入) void | setArray(const QString &key, const QStringList &value) |
(自 Visindigo 0.13.0 引入) void | setBool(const QString &key, bool value) |
(自 Visindigo 0.13.0 引入) void | setDouble(const QString &key, double value) |
(自 Visindigo 0.14.0 引入) void | setDoubleArray(const QString &key, const QList<double> &value) |
(自 Visindigo 0.13.0 引入) void | setInt(const QString &key, qint64 value) |
(自 Visindigo 0.14.0 引入) void | setIntArray(const QString &key, const QList<qint64> &value) |
(自 Visindigo 0.13.0 引入) void | setObject(const QString &key, const Visindigo::Utility::JsonConfig &value) |
(自 Visindigo 0.13.0 引入) void | setString(const QString &key, const QString &value) |
(自 Visindigo 0.13.0 引入) void | setStringList(const QString &key, const QStringList &value) |
(自 Visindigo 0.13.0 引入) void | setValue(const QString &key, const QJsonValue &value) |
(自 Visindigo 0.13.0 引入) QString | toString(int format) |
(自 Visindigo 0.13.0 引入) Visindigo::Utility::JsonConfig & | operator=(Visindigo::Utility::JsonConfig &&other) |
(自 Visindigo 0.13.0 引入) Visindigo::Utility::JsonConfig & | operator=(const Visindigo::Utility::JsonConfig &other) |
(自 Visindigo 0.13.0 引入) Visindigo::Utility::JsonValueRef | operator[](const QString &key) |
静态公开成员
(自 Visindigo 0.13.0 引入) Visindigo::Utility::JsonConfig | fromJson(const QString &jsonStr, QJsonParseError *error = nullptr) |
(自 Visindigo 0.13.0 引入) Visindigo::Utility::JsonConfig | fromMetable(const T &obj) |
(自 Visindigo 0.13.0 引入) T | toMetable(const QString &jsonStr, bool *ok = nullptr) |
(自 Visindigo 0.13.0 引入) T | toMetable(const Visindigo::Utility::JsonConfig &config, bool *ok = nullptr) |
(自 Visindigo 0.13.0 引入) void | writeMetable(T *obj, const QString &jsonStr, bool *ok = nullptr) |
(自 Visindigo 0.13.0 引入) void | writeMetable(T *obj, const Visindigo::Utility::JsonConfig &config, bool *ok = nullptr) |
详细说明
JsonConfig提供对Json配置的读写操作,可以通过此类构建基于Json的配置。 JsonConfig主体上提供的是一套纯动态方式的接口,允许你在运行时动态地访问和修改Json对象的内容, 而不需要事先定义Json对象的结构。 为此,我们规定通过句点 “.” 来访问Json对象的子对象,例如 "parent.child.key" 表示访问Json对象中键为 "parent" 的子对象中的键为 "child" 的子对象中的键为 "key" 的值。
Warning: 这种规定对键名有所限制,即键名不能包含句点。如果Json文档中的键名包含句点, 则行为未定义。
除了动态访问之外,JsonConfig也提供了一些静态函数,允许你将JsonConfig与有Q_OBJECT或 Q_GADGET的类进行转换——只要它们的成员正确的使用Q_PROPERTY进行了标记即可。 有关这部分内容请详见下文。
由于JsonConfig只是在QtJson设施上进行了一层封装,因此它的性能和QtJson基本相当。
如果你不以明确类型操作这个类,你可能还会需要查看QJsonValue、QJsonObject、QVariant 等类型的文档。它们是QtJson和可变类型量的重要套件。
JsonConfig永远不与文件直接读写挂钩,这类里所有涉及传递QString进行构造或 初始化的函数,其语义永远是传递Json字符串本体,而不是文件路径。
与之同理,可以使用toString()函数将Json对象转换为字符串。
不建议使用具有QString的构造函数,是因为此构造函数不会提示Json字符串的解析错误, 且JsonConfig没有提供中途获取解析错误的方法,因此仍然建议只用parse()函数。 但如果你确实希望一步完成构建,建议使用静态成员函数fromJson进行构造,这允许你传递一个 QJsonParseError指针来获取解析错误。
请注意,在对JsonConfig进行设置之后,需要自行使用toString()将其 保存到外部,否则设置的内容将会丢失。这同样发生在使用operator=()赋值操作符 时。
JsonConfig可重入,但不保证线程安全。要从多个线程同时操作一个JsonConfig对象,必须使用外部同步机制。
概念VI_Q_OBJECT和VI_Q_GADGET
VI_Q_OBJECT和VI_Q_GADGET是Visindigo定义的两个位于Visindigo::Utility中的 concept,分别对应具有Q_OBJECT标记和Q_GADGET标记的类。这些类已经被Qt的 元对象编译器添加了元信息,因此JsonConfig可以通过QMetaObject访问其中的 Q_PROPERTY成员,并进行相应的转换。
由于QDoc不能正确标记概念,我们在此处直接给出它们的定义:
template <typename T> concept VI_Q_OBJECT = requires(T t) { { t.metaobject() } -> std::same_as<const QMetaObject*>; }; template <typename T> concept VI_Q_GADGET = requires(T t) { { t.qt_check_for_QGADGET_macro() } -> std::same_as<void>; };
值得注意的是,由于Q_OBJECT删除了类的移动和拷贝构造函数,因此JsonConfig访问 这两种类的方式略有差别。具体来说,二者都可用fromMetable从类转换为JsonConfig。 但对于构造,Q_GADGET用返回值的方式构造,函数为toMetable。而Q_OBJECT需要 用户自己事先构造,然后调用writeMetable并传入指针以完成写入。
下面以一个Q_GADGET为例说明如何使用JsonConfig进行转换: 首先我们定义一个Q_GADGET类,并使用Q_PROPERTY标记其成员:
class MyConfig { Q_GADGET Q_PROPERTY(int intValue MEMBER intValue) Q_PROPERTY(QString stringValue MEMBER stringValue) public: int intValue; QString stringValue; }
然后我们假定存在这样的Json字符串:
QString jsonStr = R"({ "intValue": 42, "stringValue": "Hello, World!" })";
我们就可以通过fromJson函数将其转换为JsonConfig对象:
MyConfig config = JsonConfig::toMetable<MyConfig>(JsonConfig::fromJson(jsonStr));
如果MyConfig非常不幸的是一个Q_OBJECT类,那么最后一步只需改为:
MyConfig config; JsonConfig::fromMetable(&config, JsonConfig::fromJson(jsonStr));
另请参阅 Visindigo::Utility::JsonDocument, QJsonObject, and QJsonValue.
成员函数文档
[since Visindigo 0.13.0] JsonConfig::JsonConfig()
VIJsonConfig的默认构造函数
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] JsonConfig::JsonConfig(const QJsonDocument &json)
json 为Json对象。 VIJsonConfig的构造函数
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] JsonConfig::JsonConfig(const QString &jsonStr)
jsonStr 为Json字符串。 VIJsonConfig的构造函数
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] JsonConfig::JsonConfig(const QVariant &variant)
variant 为QVariant对象。 从QVariant构造一个JsonConfig对象。
这个function 从 Visindigo 0.13.0 开始支持。
[noexcept, since Visindigo 0.13.0] JsonConfig::JsonConfig(const Visindigo::Utility::JsonConfig &other)
other 为VIJsonConfig的另一个实例。 VIJsonConfig的拷贝构造函数
这个function 从 Visindigo 0.13.0 开始支持。
[noexcept, since Visindigo 0.13.0] JsonConfig::JsonConfig(Visindigo::Utility::JsonConfig &&other)
other 为VIJsonConfig的另一个实例。 VIJsonConfig的移动构造函数
这个function 从 Visindigo 0.13.0 开始支持。
[noexcept, since Visindigo 0.13.0] JsonConfig::~JsonConfig()
VIJsonConfig的析构函数
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] void JsonConfig::clear()
清空Json对象的内容。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] bool JsonConfig::contains(const QString &key) const
key 为键。
return 指定Json节点是否为是否包含指定的键。
这个function 从 Visindigo 0.13.0 开始支持。
[static, since Visindigo 0.13.0] Visindigo::Utility::JsonConfig JsonConfig::fromJson(const QString &jsonStr, QJsonParseError *error = nullptr)
jsonStr 为Json字符串。 error 为指向QJsonParseError对象的指针,用于获取解析错误信息。默认为nullptr。 从Json字符串构造一个JsonConfig对象,并返回该对象。如果解析过程中发生错误,可以通过 error 参数获取错误信息。
这个function 从 Visindigo 0.13.0 开始支持。
[static, since Visindigo 0.13.0] template <typename T> Visindigo::Utility::JsonConfig JsonConfig::fromMetable(const T &obj)
obj 为具有Q_GADGET或Q_OBJECT标记的类的实例。 从具有Q_GADGET或Q_OBJECT标记的类的实例构造一个JsonConfig对象,并返回该对象。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] QList<Visindigo::Utility::JsonConfig> JsonConfig::getArray(const QString &key = "", bool *ok = nullptr) const
key 为键。 ok 为接受是否正常工作的结果指针
return 指定Json节点的数组。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] bool JsonConfig::getBool(const QString &key = "", bool *ok = nullptr) const
key 为键。 ok 为接受是否正常工作的结果指针
return 指定Json节点的布尔值。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] double JsonConfig::getDouble(const QString &key = "", bool *ok = nullptr) const
key 为键。 ok 为接受是否正常工作的结果指针
return 指定Json节点的浮点数值。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.14.0] QList<double> JsonConfig::getDoubleArray(const QString &key = "", bool *ok = nullptr) const
key 为键。 ok 为接受是否正常工作的结果指针
return 指定Json节点的double列表。
这个function 从 Visindigo 0.14.0 开始支持。
[since Visindigo 0.13.0] qint64 JsonConfig::getInt(const QString &key = "", bool *ok = nullptr) const
key 为键。 ok 为接受是否正常工作的结果指针
return 指定Json节点的整数值。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.14.0] QList<qint64> JsonConfig::getIntArray(const QString &key = "", bool *ok = nullptr) const
key 为键。 ok 为接受是否正常工作的结果指针
return 指定Json节点的qint64列表。
这个function 从 Visindigo 0.14.0 开始支持。
[since Visindigo 0.13.0] Visindigo::Utility::JsonConfig JsonConfig::getObject(const QString &key = "", bool *ok = nullptr) const
key 为键。 ok 为接受是否正常工作的结果指针
return 指定Json节点的子对象。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] QString JsonConfig::getString(const QString &key = "", bool *ok = nullptr) const
key 为键。 ok 为接受是否正常工作的结果指针
return 指定Json节点的字符串值。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] QStringList JsonConfig::getStringList(const QString &key = "", bool *ok = nullptr) const
key 为键。 ok 为接受是否正常工作的结果指针
return 指定Json节点的字符串列表。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] QJsonValue JsonConfig::getValue(const QString &key = "", bool *ok = nullptr) const
key 为键。 ok 为接受是否正常工作的结果指针 return 指定Json节点的值。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] bool JsonConfig::isArray(const QString &key = "") const
key 为键。
return 指定Json节点是否为是否为数组。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] bool JsonConfig::isBool(const QString &key = "") const
key 为键。
return 指定Json节点是否为是否为布尔值。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] bool JsonConfig::isDouble(const QString &key = "") const
key 为键。
return 指定Json节点是否为是否为浮点数。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] bool JsonConfig::isEmpty(const QString &key = "") const
key 为键。
return 指定Json节点是否为是否为空。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] bool JsonConfig::isInt(const QString &key = "") const
key 为键。
return 指定Json节点是否为是否为整数。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] bool JsonConfig::isNull(const QString &key = "") const
key 为键。
return 指定Json节点是否为是否为空。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] bool JsonConfig::isObject(const QString &key = "") const
key 为键。
return 指定Json节点是否为是否为对象。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] bool JsonConfig::isString(const QString &key = "") const
key 为键。
return 指定Json节点是否为是否为字符串。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] QStringList JsonConfig::keys(const QString &key = "") const
key 为键。
return 指定Json节点的所有键。(不包括子对象)
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] QJsonParseError JsonConfig::parse(const QString &jsonStr)
jsonStr 为Json字符串。
解析Json字符串。如果解析成功,返回的QJsonParseError的error属性为QJsonParseError::NoError。 并立即覆盖全部原有内容。如果解析失败,返回的QJsonParseError的error属性为相应的错误类型。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] bool JsonConfig::remove(const QString &key)
key 为键。 删除Json对象的键值对。 return 如果成功删除了键值对,返回true;如果没有找到键,返回false。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] void JsonConfig::setArray(const QString &key, const QList<Visindigo::Utility::JsonConfig> &value)
key 为键。 value 为数组。
设置指定Json节点为数组。
这个function 从 Visindigo 0.13.0 开始支持。
另请参阅 isArray().
[since Visindigo 0.13.0] void JsonConfig::setArray(const QString &key, const QStringList &value)
key 为键。 value 为字符串列表。
设置指定Json节点为字符串列表。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] void JsonConfig::setBool(const QString &key, bool value)
key 为键。 value 为布尔值。
设置指定Json节点为布尔值。
这个function 从 Visindigo 0.13.0 开始支持。
另请参阅 isBool().
[since Visindigo 0.13.0] void JsonConfig::setDouble(const QString &key, double value)
key 为键。 value 为浮点数值。
设置指定Json节点为浮点数值。
这个function 从 Visindigo 0.13.0 开始支持。
另请参阅 isDouble().
[since Visindigo 0.14.0] void JsonConfig::setDoubleArray(const QString &key, const QList<double> &value)
key 为键。 value 为浮点数列表。
设置指定Json节点为浮点数列表。
这个function 从 Visindigo 0.14.0 开始支持。
[since Visindigo 0.13.0] void JsonConfig::setInt(const QString &key, qint64 value)
key 为键。 value 为整数值。
设置指定Json节点为整数值。
这个function 从 Visindigo 0.13.0 开始支持。
另请参阅 isInt().
[since Visindigo 0.14.0] void JsonConfig::setIntArray(const QString &key, const QList<qint64> &value)
key 为键。 value 为整数列表。
设置指定Json节点为整数列表。
这个function 从 Visindigo 0.14.0 开始支持。
[since Visindigo 0.13.0] void JsonConfig::setObject(const QString &key, const Visindigo::Utility::JsonConfig &value)
key 为键。 value 为子对象。
设置指定Json节点为子对象。
这个function 从 Visindigo 0.13.0 开始支持。
另请参阅 isObject().
[since Visindigo 0.13.0] void JsonConfig::setString(const QString &key, const QString &value)
key 为键。 value 为字符串值。
设置指定Json节点为字符串值。
这个function 从 Visindigo 0.13.0 开始支持。
另请参阅 isString().
[since Visindigo 0.13.0] void JsonConfig::setStringList(const QString &key, const QStringList &value)
key 为键。 value 为整数列表。
设置指定Json节点为字符串列表。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] void JsonConfig::setValue(const QString &key, const QJsonValue &value)
key 为键。 value 为值。
设置指定Json节点为值。
这个function 从 Visindigo 0.13.0 开始支持。
[static, since Visindigo 0.13.0] template <typename T> T JsonConfig::toMetable(const QString &jsonStr, bool *ok = nullptr)
jsonStr 为Json字符串。 ok 为指向bool类型的指针,用于获取转换是否成功的信息。默认为nullptr。 将Json字符串转换为具有Q_GADGET标记的类的实例,并返回该实例。如果转换过程中发生错误,ok参数将被设置为false。
这个function 从 Visindigo 0.13.0 开始支持。
[static, since Visindigo 0.13.0] template <typename T> T JsonConfig::toMetable(const Visindigo::Utility::JsonConfig &config, bool *ok = nullptr)
config 为JsonConfig对象。 ok 为指向bool类型的指针,用于获取转换是否成功的信息。默认为nullptr。 将JsonConfig对象转换为具有Q_GADGET标记的类的实例,并返回该实例。如果转换过程中发生错误,ok参数将被设置为false。
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] QString JsonConfig::toString(int format)
format 为Json格式。
return 以指定格式将Json对象转换为字符串。
这个function 从 Visindigo 0.13.0 开始支持。
[static, since Visindigo 0.13.0] template <typename T> void JsonConfig::writeMetable(T *obj, const QString &jsonStr, bool *ok = nullptr)
obj 为指向具有Q_OBJECT标记的类的实例的指针。 jsonStr 为Json字符串。 ok 为指向bool类型的指针,用于获取转换是否成功的信息。默认为nullptr。 将Json字符串写入具有Q_OBJECT标记的类的实例中。如果写入过程中发生错误,ok参数将被设置为false。
这个function 从 Visindigo 0.13.0 开始支持。
[static, since Visindigo 0.13.0] template <typename T> void JsonConfig::writeMetable(T *obj, const Visindigo::Utility::JsonConfig &config, bool *ok = nullptr)
obj 为指向具有Q_OBJECT标记的类的实例的指针。 config 为JsonConfig对象。 ok 为指向bool类型的指针,用于获取转换是否成功的信息。默认为nullptr。 将JsonConfig对象写入具有Q_OBJECT标记的类的实例中。如果写入过程中发生错误,ok参数将被设置为false。
这个function 从 Visindigo 0.13.0 开始支持。
[noexcept, since Visindigo 0.13.0] Visindigo::Utility::JsonConfig &JsonConfig::operator=(Visindigo::Utility::JsonConfig &&other)
other 为VIJsonConfig的另一个实例。 VIJsonConfig的移动操作符
这个function 从 Visindigo 0.13.0 开始支持。
[noexcept, since Visindigo 0.13.0] Visindigo::Utility::JsonConfig &JsonConfig::operator=(const Visindigo::Utility::JsonConfig &other)
other 为VIJsonConfig的另一个实例。 VIJsonConfig的赋值操作符
这个function 从 Visindigo 0.13.0 开始支持。
[since Visindigo 0.13.0] Visindigo::Utility::JsonValueRef JsonConfig::operator[](const QString &key)
key 为键。 一个重载操作符,旨在以类似下标访问的方式访问Json对象,返回一个VIJsonValueRef实例。 此实例支持直接赋值,也可以使用指针操作符访问QJsonValue。此实例还重载了到QJsonValue的 隐式转换,可以直接将其赋值给QJsonValue。
这个function 从 Visindigo 0.13.0 开始支持。