我目前正在使用Qt5.0和核心QJson库来处理我正在开发的程序的一些数据.
要为此问题设置场景,我将为您提供一些说明我的问题的JSON数据:
{
"CLOCKS": [
{
"ID": "clk",
"MAX": 2e+08,
"MIN": 1e+07,
"VALUE": "no_clock"
},
{
"ID": "memclk",
"MAX": 2e+08,
"MIN": 1e+07,
"VALUE": "memclk"
}
]
}
Run Code Online (Sandbox Code Playgroud)
这里我们有一个包含单个键'CLOCKS'的父QJsonObject.此键的值是QJsonObject的QJsonArray,它包含许多包含我的数据的键/值对.
如果我想检索id为'clk'的QJsonObject,我目前正在使用这样的代码:
// imagine m_data is my parent QJsonObject
QJsonArray clocks = m_data["CLOCKS"].toArray();
foreach (const QJsonValue & value, clocks) {
QJsonObject obj = value.toObject();
if (obj["ID"].toString() == "clk") {
return obj;
}
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,图书馆到目前为止一直很好.但是,当我想要获取用于修改的QJsonObject 引用而不是副本时,我最近开始遇到问题.
所以我的问题是,给定样本数据提供了如何获取QJsonObject引用以修改所需时钟数据对象中的键/值对.问题表明,IMO由于你可以获得QJsonValueRefs,它是对值条目的引用...但实际访问其中的数据(如果值是另一个数组/对象),你必须使用toArray转换(),toObject()函数等.此函数仅返回副本而不是引用,从而创建一个障碍,以使用引用向下迭代对象层次结构.
到目前为止,我想出来的唯一方法就是创建整个"CLOCKS"QJsonArray的副本,找到我想要的对象,然后将其删除并重新插入更改的数据......最后分配整个数组返回父对象中的"CLOCKS"键.这对我来说似乎很麻烦,我觉得我做错了什么,必须有更好的方法.
这里支持这个是我的代码到目前为止的样子...只是改变其中一个时钟QJsonObjects的"VALUE":
QJsonArray resets = m_data.value(TAG_RESETS).toArray();
// get a copy of the QJsonObject
QJsonObject obj;
foreach …Run Code Online (Sandbox Code Playgroud) 我如何在Qt中JSON序列化QVariant(或其他类型的数据).我不想使用像QJson这样的外部第三方库
我想在symbian应用程序中解析此JSON输出:
[
{"ID":"9","titel":"wouter","plaatsID":"2616","prio":"3"},
{"ID":"8","titel":"pasta","plaatsID":"3780","prio":"3"},
{"ID":"6","titel":"Muts prikken","plaatsID":"3780","prio":"2"
{"ID":"5","titel":"doorplannen","plaatsID":"3840","prio":"2"}
{"ID":"4","titel":"Gasfles","plaatsID":"3780","prio":"2"}
]
Run Code Online (Sandbox Code Playgroud)
为此,我编写了以下代码,但我无法读取数据.其他单个JSON输出它工作正常,但多输出不起作用:
void start::finishedSlot(QNetworkReply * reply)
{
// Reading attributes of the reply
// e.g. the HTTP status code
reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
// see CS001432 on how to handle this
// no error received?
if (reply->error() == QNetworkReply::NoError)
{
QByteArray data = reply->readAll();
bool ok;
QVariantMap result = Json::parse(QString(data), ok).toMap();
if(!ok) {
qFatal("An error occurred during parsing");
exit(1);
}
QMapIterator<QString, int> i(result);
while (i.hasNext()) {
i.next();
cout << i.key() << ": " << …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用qmake在我的系统中编译项目.项目的某些依赖项未安装但位于我的主目录中,或多或少像这样:libs文件:/home/myusername/local/lib和我的包含目录/home/myusername/local/include.在include目录中,我有一个文件夹,qjson包含库中所需的标题.在lib文件夹中我有文件libqjson.so libqjson.so.0 libqjson.so.0.7.1.
我的qmake项目文件看起来像这样:
linux-g++ {
INCLUDEPATH += /home/myusername/local/include/
LIBS += -L/home/myusername/local/lib/ -lqjson
}
Run Code Online (Sandbox Code Playgroud)
生成的makefile将生成如下命令:
g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB \
-DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qbuzz \
-I/usr/include/qt4/QtCore -I/usr/include/qt4/QtNetwork -I/usr/include/qt4/QtGui \
-I/usr/include/qt4 -I/home/myusername/local/include/ -I. -I. -I../myproject -I. \
-o qbuzz-result.o ../myproject/myfile.cc
Run Code Online (Sandbox Code Playgroud)
很明显,我的include目录是-Igcc 的选项.myfile.cc包含像这样的包含:
#include <qjson/parser.h>
Run Code Online (Sandbox Code Playgroud)
但是,在运行make之后,我收到错误:
../myproject/myfile.cc:2:26: fatal error: qjson/parser.h: No such file or directory
compilation terminated.
Run Code Online (Sandbox Code Playgroud)
现在,如果我修改环境变量CPLUS_INCLUDE_PATH以添加我的本地包含文件,那么我没有问题,但是在链接器阶段我得到了错误:
/usr/bin/ld: cannot find -lqjson
collect2: …Run Code Online (Sandbox Code Playgroud) 我正在使用QJson序列化一个QObject衍生类.我能够毫无问题地序列化类本身,但是当涉及到其中一个成员时,我遇到了一些麻烦.
该类已命名CProject,它包含一个属性files,定义为:
QList<CProjectFile> files;
Run Code Online (Sandbox Code Playgroud)
序列化实例时CProject,我在控制台中收到一条消息:
QMetaProperty::read: Unable to handle unregistered datatype 'QList<CProjectFile>' for property 'CProject::files'
我在某处读到了我必须注册的数据类型,所以我在声明之后添加了以下内容CProject:
Q_DECLARE_METATYPE(QList<CProjectFile>)
Run Code Online (Sandbox Code Playgroud)
......当那无所作为时,我补充道:
qRegisterMetaType< QList<CProjectFile> >();
Run Code Online (Sandbox Code Playgroud)
什么都行不通.我究竟做错了什么?
我有QByteArray,包含此JSON
{"response":
{"count":2,
"items":[
{"name":"somename","key":1"},
{"name":"somename","key":1"}
]}}
Run Code Online (Sandbox Code Playgroud)
需要解析并获取所需的数据:
QJsonDocument itemDoc = QJsonDocument::fromJson(answer);
QJsonObject itemObject = itemDoc.object();
qDebug()<<itemObject;
QJsonArray itemArray = itemObject["response"].toArray();
qDebug()<<itemArray;
Run Code Online (Sandbox Code Playgroud)
第一次调试显示记录在itemObject中的所有QByteArray的内容,第二次调试不显示任何内容。
我是否必须对此进行解析,否则为什么此方法无效?
保存UI设置QSettings既麻烦又有问题,因为每次必须使用setValue()和value()运行功能,并且还要定义可能在大型应用程序中出错的组,应用程序名称和组织:
QSettings settings(qApp->applicationDirPath() + "/" + qApp->applicationName() + ".ini" , QSettings::IniFormat) ...
settings.beginGroup("someGroup");
settings.setValue("someKey", "blah blah");
QString str = settings.value("someKey");
settings.endGroup();
Run Code Online (Sandbox Code Playgroud)
但是使用JSON可以更简单:
QJsonObject obj;
obj["someKey"] = "blah blah"
...
Run Code Online (Sandbox Code Playgroud)
保存和恢复ui设置的最佳做法是什么?
保存每个键/值QSettings?
保存QJson并随后保存QSettings?
QJson仅保存(使用另一种机制来定义组和应用程序)?
还有其他想法吗?
目前,我正在迭代一个向量,以便将其转换为 QJsonArray:
QJsonArray toJson(const std::vector<unsigned short>& myVec) {
QJsonArray result;
for(auto i = myVec.begin(); i != myVec.end(); i++) {
result.push_back((*i));
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
然而,这会导致我的程序出现轻微的滞后峰值。是否有其他方法可以接收带有向量数据的 QJsonArray?(它不需要是深拷贝。)
如何转换QVariant为QJsonValue?我知道QVariant提供了该toJsonValue功能,但它没有按预期执行。
例如:
qDebug()<<QVariant(1.0).toJsonValue();
qDebug()<<QVariant("test").toJsonValue();
Run Code Online (Sandbox Code Playgroud)
两者都返回:
QJsonValue(null)
QJsonValue(null)
Run Code Online (Sandbox Code Playgroud)
期望输出:
QJsonValue(double, 1)
QJsonValue(string, "test")
Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我使用json对象从远程数据库获取结果。通常响应字符串如下所示:
{
status:"ok",
data: [
{ field1:"value1", field2:"value2", field3:"value3" },
{ field1:"value4", field2:"value5", field3:"value6" },
{ field1:"value7", field2:"value8", field3:"value9" }
]
}
Run Code Online (Sandbox Code Playgroud)
它看起来不错,我可以通过以下方式从指定的行/列中获取值:
QJsonDocument jsonResponse = QJsonDocument::fromJson(strReply.toUtf8());
QJsonObject responseObject = jsonResponse.object();
if(responseObject.value("status").toString() == "ok") {
QJsonArray dataObject = responseObject.value("data").toArray();
// and here I can get the value, for example 2-nd row, field2
QString value = dataObject.at(1).toObject().value("field2").toString();
}
Run Code Online (Sandbox Code Playgroud)
但有时我需要不按名称而是按索引获取值。好的,我执行以下操作:
QJsonObject obj = dataObject.at(1).toObject();
QString key = obj.keys().at(1); // I use index here instead of name
QString value = obj.value(key).toString(); …Run Code Online (Sandbox Code Playgroud) 我知道这是一个愚蠢的问题,但仍然存在.
我想在我的项目中使用QJson库.我从官方网站下载了tarball(可能需要提一下我是64位Ubuntu 12.04).该INSTALL文件有以下说明
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=_preferred_path_ ..
make
make install
/sbin/ldconfig, if necessary
Run Code Online (Sandbox Code Playgroud)
正是我遵循的.我已经得到了/include,/lib和shareQJson的文件夹添加到我的/usr/local.
之后,我打开我的IDE(这是QtCreator),并使用以下简单代码创建一个测试项目:
#include <QVariant>
#include <qjson/serializer.h>
int main(int argc, char *argv[])
{
QJson::Serializer s;
QVariantMap map;
map["hello"] = QVariantList() <<"t1"<<"t2";
QByteArray json = s.serialize(map);
}
Run Code Online (Sandbox Code Playgroud)
在#include被处理的很好,所有的类型都认可,自动完成对QJson类工作正常.但是,在尝试编译时,我得到了这个(删除了完整路径以提高可读性):
<...>/QJsonTest/main.cpp:15: undefined reference to `QJson::Serializer::Serializer()'
<...>/QJsonTest/main.cpp:18: undefined reference to `QJson::Serializer::serialize(QVariant const&)'
<...>/QJsonTest/main.cpp:18: undefined reference to `QJson::Serializer::~Serializer()'
<...>/QJsonTest/main.cpp:18: undefined reference to `QJson::Serializer::~Serializer()'
collect2: ld returned …Run Code Online (Sandbox Code Playgroud)