标签: qjson

在Qt 4.7中解析JSON的最简单方法

我需要通过Qt解析JSON对象.最简单/最快的方法是什么?

qt parsing json qt4 qjson

30
推荐指数
5
解决办法
4万
查看次数

如何在不使用副本的情况下更改QJson层次结构中的QJsonObject值?

我目前正在使用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)

c++ qt json qt5 qjson

16
推荐指数
2
解决办法
1万
查看次数

如何在Qt中序列化为JSON

我如何在Qt中JSON序列化QVariant(或其他类型的数据).我不想使用像QJson这样的外部第三方库

c++ serialization qt json qjson

13
推荐指数
3
解决办法
1万
查看次数

Qt中的JSON使用QVariantMap

我想在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)

qt json symbian qjson

9
推荐指数
2
解决办法
2万
查看次数

gcc -I和-L选项似乎不起作用

我正在尝试使用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)

c++ linux gcc include-path qjson

5
推荐指数
1
解决办法
2510
查看次数

如何注册以下数据类型以允许序列化?

我正在使用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)

什么都行不通.我究竟做错了什么?

qt custom-data-type qjson

4
推荐指数
1
解决办法
3109
查看次数

从QByteArray进行QT5 JSON解析

我有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的内容,第二次调试不显示任何内容。

我是否必须对此进行解析,否则为什么此方法无效?

c++ parsing qt5 qjson

4
推荐指数
1
解决办法
7768
查看次数

使用QSettings或QJson保存UI设置?

保存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仅保存(使用另一种机制来定义组和应用程序)?

还有其他想法吗?

user-interface qt qsettings qjson

4
推荐指数
1
解决办法
2501
查看次数

将 Vector 转换为 QJsonArray 的最快方法?

目前,我正在迭代一个向量,以便将其转换为 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?(它不需要是深拷贝。)

c++ qt move vector qjson

3
推荐指数
1
解决办法
3156
查看次数

如何将 QVariant 转换为 QJsonValue?

如何转换QVariantQJsonValue?我知道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)

c++ qt qjson

2
推荐指数
1
解决办法
2502
查看次数

通过索引从 QJsonObject 获取值

在我的应用程序中,我使用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)

c++ qt json qjson qjsonobject

1
推荐指数
1
解决办法
2万
查看次数

使用QJson库

我知道这是一个愚蠢的问题,但仍然存在.

我想在我的项目中使用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,/libshareQJson的文件夹添加到我的/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)

c++ qt static-libraries qjson

-1
推荐指数
1
解决办法
1282
查看次数