QS的解析器为json

时间:2014-03-08 19:05:33

标签: c++ json qt qt5 qtcore

我需要使用QT在C ++中编辑我的解析器代码。我受到某人的启发。我遇到了一个问题,他只解析了我的.json文件的一半。

这是我的代码:

    #include <QJsonArray>
    #include "mainwindow.h"
    #include <QApplication>
    #include <stdio.h>
    #include <QPushButton>
    #include <QFile>
    #include <QDebug>
    #include <QJsonDocument>
    #include <QJsonObject>
    #include <QTranslator>
    #include "parcer_js.h"
    #include <iostream>
    #include <QList>
    #include <QString>
    #include <string>
    #include <parcer_js.h>
    #include <Mail.hpp>
    #include <QDate>

void Parcer::parcerJs()
{
      QString val;
      QFile file;
      file.setFileName("jstest.json");

      file.open(QIODevice::ReadOnly | QIODevice::Text);
      val = file.readAll();
      file.close();

      QJsonDocument d = QJsonDocument::fromJson(val.toUtf8());
      ParcerByfile(d);
}

void Parcer::ParcerByfile(QJsonDocument d)
{
      QJsonObject sett2 = d.object();
      qWarning() << sett2;

      QJsonValue value = sett2.value(QString("123")); // Problem !!! 
      QJsonObject item = value.toObject();

      QJsonValue subFrom = item["from"];
      qWarning() << subFrom.toString();

      QJsonArray strTo = item["to"].toArray();
      qWarning() << strTo[0].toString();
      qWarning() << strTo[1].toString();
} 

这是.json代码:

{
    "123": {
        "from": "magellan.dunord@antarctica.com",
        "to": [
            "lol@hotmail.fr",
            "pipo@antartica-base.com"
        ],
        "cc": [
            "johndoe@il2.fr",
            "gordonfreeman@antarctica.com"
        ],
        "cci": [
            "missepitech@antarctica.com"
        ],
        "obj": "trolol > all",
        "contenu": "Hello  3301  Word ! !",
        "date": "21-1-1993",
        "domaine": "antartica-base.com",
        "state": "0",
        "pseudo_f": "Jd"
    },
    "456": {
        "from": "pipo@antarctica.com",
        "to": [
            "lol@hotmail.fr",
            "pipo@antartica-base.com"
        ],
        "cc": [
            "johndoe@flavicon.fr",
            "gordonfreeman@qwerty.fr"
        ],
        "cci": [
            "missepitech@antarctica.com"
        ],
        "obj": "3301 > all",
        "contenu": "Hello 3301 Word ! !",
        "date": "21-12-1993",
        "domaine": "antartica-base.com",
        "state": "0",
        "pseudo_f": "Jd"
    }
}

问题出在这一行:

QJsonValue value = sett2.value(QString("123"));

我需要首先找到这个“:{”后面的ID,我将创建一个系统

因为我的代码只在我的.json文件中解析“123”部分。 我想知道如何将“123”和“456”解析为项目或列表。因为通常我不知道ID是什么。

2 个答案:

答案 0 :(得分:1)

这可以通过获取所有键来完成,然后您可以在返回的QStringList上使用第一个方法。

有关详细信息,请参阅documentation

因此,你会写这样的东西:

QJsonValue value = sett2.value(sett2.keys().first()); // NO Problem !!!

您可能会使用begin iterator以及以下内容:

QJsonValue value = sett2.begin().value();

以下是完整的示例项目供参考:

main.json

{
    "123": {
        "from": "magellan.dunord@antartica-base.com",
        "to": [
            "lol@hotmail.fr",
            "pipo@antartica-base.com"
        ],
        "cc": [
            "johndoe@antartica-base.com",
            "gordonfreeman@antartica-base.com"
        ],
        "cci": [
            "missepitech@antartica-base.com"
        ],
        "obj": "EpiMTP2017 > all",
        "contenu": "Hello  3301  Word ! !",
        "date": "21-12-1993",
        "domaine": "antartica-base.com",
        "state": "0",
        "pseudo_f": "Jd"
    },
    "456": {
        "from": "laray.croft@antartica-base.com",
        "to": [
            "lol@hotmail.fr",
            "pipo@antartica-base.com"
        ],
        "cc": [
            "johndoe@antartica-base.com",
            "gordonfreeman@antartica-base.com"
        ],
        "cci": [
            "missepitech@antartica-base.com"
        ],
        "obj": "EpiMTP2017 > all",
        "contenu": "Hello 3301 Word ! !",
        "date": "21-12-1993",
        "domaine": "antartica-base.com",
        "state": "0",
        "pseudo_f": "Jd"
    }
}

main.pro

TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp

的main.cpp

#include <QFile>
#include <QByteArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QDebug>

int main()
{
    QFile file("main.json");
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    QByteArray jsonData = file.readAll();
    file.close();

    QJsonDocument d = QJsonDocument::fromJson(jsonData);
    QJsonObject sett2 = d.object();

    QJsonValue value = sett2.begin().value();
    QJsonValue value2 = sett2.value(sett2.keys().first());
    qDebug() << value;
    qDebug() << " =========== ";
    qDebug() << value2;
    return 0;
}

构建并运行

qmake && make && ./main

输出

QJsonValue(object, QJsonObject({"cc": ["johndoe@antartica-base.com","gordonfreeman@antartica-base.com"],"cci": ["missepitech@antartica-base.com"],"contenu": "Hello  3301  Word ! !","date": "21-12-1993","domaine": "antartica-base.com","from": "magellan.dunord@antartica-base.com","obj": "EpiMTP2017 > all","pseudo_f": "Jd","state": "0","to": ["lol@hotmail.fr","pipo@antartica-base.com"]}) ) 
===========  
QJsonValue(object, QJsonObject({"cc": ["johndoe@antartica-base.com","gordonfreeman@antartica-base.com"],"cci": ["missepitech@antartica-base.com"],"contenu": "Hello  3301  Word ! !","date": "21-12-1993","domaine": "antartica-base.com","from": "magellan.dunord@antartica-base.com","obj": "EpiMTP2017 > all","pseudo_f": "Jd","state": "0","to": ["lol@hotmail.fr","pipo@antartica-base.com"]}) )

答案 1 :(得分:0)

非常感谢Laszlo!

我确实喜欢这样做以获取我文件中的所有内容

  QJsonObject sett2 = d.object();
        QStringList list = sett2.keys();
        for (int i = 0; i < list.size(); i++)
        {
            QJsonValue value = sett2.value(list.at(i));
            ParcerByfile(value);
        }