- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作支持 Qt TreeView 和 Qt Json 的 Json 格式数据编辑器。我想将 QJsonObject 或 QJsonArray 引用参数传递给函数。
这个有效:
void makeJsonData(QJsonObject &obj) {
obj.insert("key", 1234);
}
//call makeJsonData()
QJsonObject jobj;
makeJsonData(jobj);
int keysize = jobj.keys().size(); //1, OK.
但不是这个:
//QJsonValue, because it can handle both QJsonObject and QJsonArray
void makeJsonData(QJsonValue &obj) {
obj.toObject().insert("key", 1234); //obj is QJsonObject
}
//call makeJsonData()
QJsonObject jobj;
makeJsonData(QJsonValue::fromVariant(jobj)); //fromVariant() to cast QJsonObject to QJsonValue
int keysize = jobj.keys().size(); //0, Fail.
看起来 QJsonValue::toObject() 只是复制参数..如何使用一种参数类型同时使用 QJsonObject 和 QJsonArray 的引用?
最佳答案
我认为有几种方法可以解决您的问题:
选项 1(如我评论中所述)
可以像这样使用动态转换:
bool makeJsonData(void* obj) {
QJsonObject* asObj = dynamic_cast<QJsonObject*>(obj);
QJsonArray* asArray = dynamic_cast<QJsonArray*>(obj);
if (asObj) {
//do what you would if it were an object
}
else if (asArray) {
//do what you would if it were an array
}
else {
//cast fail. Returning false to tell the caller that they passed bad data
//an alternate (probably better) would be to throw an exception
return false;
}
}
选项 2
老实说,我觉得用 void*
做这件事是错误的做法。做 void*
的事情几乎总是一种代码味道(它删除了编译时检查,避免我们踩到自己的脚),在这种情况下,我认为你做这件事的方式需要改进。此外,dynamic_cast
需要 RTTI它可能并不总是打开(编译器支持、性能问题等)。
我查看了我机器上的 Qt 头文件,据我所知,QJsonObject
和 QJsonArray
并没有真正继承任何东西,所以继续往下看将 void*
更改为基本类型以保持类似类型检查的方法不太可行。
我会做的是:
QJsonObject createJsonData()
)并在上述两个方法中调用它。想法是在保留类型检查的同时减少代码重复。您花在处理这两种情况的一个额外方法上所花费的时间可能远远少于您在不小心将某些内容传递给您从未打算传递的 void*
指针后调试代码所花费的时间。
选项 3
或者,您可以使用QJsonValue
,将函数的返回类型更改为QJsonValue
,并使其在不修改原始对象的情况下返回新对象。此外,QJsonValue
类具有那些有趣的 isArray
/isObject
方法,您可以使用它们来执行前面提到的操作。一个例子:
QJsonValue makeJsonData(const QJsonValue& val) {
if (val.isObject()) {
QJsonObject obj = val.toObject();
//do your stuff, modifying obj as you please (perhaps calling another method so that this can have less repetition
return QJsonValue(obj);
}
else if (val.isArray()) {
QJsonArray arr = val.toArray();
//do your stuff, modifying arr as you please (perhaps calling another method so that this can have less repetition
return QJsonValue(arr);
}
else {
throw "Invalid Value Type";
}
}
老实说,我更喜欢这种模式,但我知道有理由采用您提到的方式,例如避免不必要的内存分配。
关于c++ - Qt - 传递 QJsonObject 或 QJsonArray 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23235122/
如何根据 QJsonArray 的子级之一实现自定义排序? 我有基于此 JSON 的 QJsonArray 玩具: "toys": [ { "type": "teddy",
我有以下 JsonArray 并想通过其“ID”搜索值。这里是存储在 QJsonArray 中的 JSON: { "datasources":[ {"id":1, "name":"tps-
我有以下 JsonArray 并想通过其“ID”搜索值。这里是存储在 QJsonArray 中的 JSON: { "datasources":[ {"id":1, "name":"tps-
我想从 QJsonArray 中删除所有元素,但我遇到的麻烦比我想象的要多得多。这是我的代码: void Assessment::clearQJsonArray(QJsonArray *array)
我像这样向 QJsonObjects 插入很多不同的值: //gender inserted to QJsonObject gender QJsonObject gender; gender.inse
假设我有一个类型的函数: bool sortJson(QJsonArray &); 应该对 QJsonArray 进行排序(并返回真)如果所有成员都是 double .我知道我可以建立一个辅助 QVe
假设我有一个名为 groupBoxFlags(JSON 名称:flags)的 checkable QGroupBox,它有四个 QCheckBox将 checkBoxFlag1 命名为 checkBo
我正在尝试创建一个 json 文件,在其中我将 QjsonObjects 插入到唯一的一个 QJsonArray 中,我得到的是每个 QjsonObject 都在一个独立的 QJsonArray 中,
我有一个对象,我使用下面的代码将它序列化为 JSON(另请参阅结构): struct RegisterItem { RegisterType Type = RegisterType::Read
我正在尝试从 QString 获取数组。 我在网上得到了将字符串转换为 QJsonDocument 的建议,但是,我的数组是空的。 QString string = "\"person\":\"{\"
我有这 2 个变量,我想将数据转换为 dataToString。 QJSonArray data; Qstring dataToString; 数据中有一个巨大的 json,如: { "pro
我正在寻找一个最小的完整的可执行qt或c++代码示例来解析和编写以下Json代码: { "FirstName": "John", "LastName": "Doe", "Mid
目前,我正在遍历一个 vector ,以便将其转换为 QJsonArray: QJsonArray toJson(const std::vector& myVec) { QJsonArray
使用老式循环,我可以深入研究 QJsonArray并且,在下面的示例中,为每个数组项添加元素“foo”以及现有元素“bar”的内容。如何使用基于 C++11 范围的 for 来做到这一点? // QJ
我正在制作支持 Qt TreeView 和 Qt Json 的 Json 格式数据编辑器。我想将 QJsonObject 或 QJsonArray 引用参数传递给函数。 这个有效: void make
我正在使用 Qt5。我正在尝试从 json 对象获取值。这是我试图从中获取数据的 json 对象的样子: { "success": true, "properties": [
我是一名优秀的程序员,十分优秀!