QT如何解析数组json中的对象

Posted

技术标签:

【中文标题】QT如何解析数组json中的对象【英文标题】:QT how to parse objects inside an array json 【发布时间】:2018-07-03 04:52:07 【问题描述】:

我有一个具有以下结构的 JSON

[
    "primul": "Thor",
    "alDoilea": "Odin",
    "alTreilea": "Loki"
,


    "s": 1,
    "d": 7,
    "hp": 39
,


    "1": "sabie",
    "2": "scut",
    "3": "coif"

]

基本上它是一个内部有 x 个对象的数组。

我尝试使用 QVariant 将数据转换为列表,然后映射列表中的元素,但在使用 QVariantMap 时它一直抛出我无法将 const char 转换为 int

我哪里错了?

这是我的代码

QFile file2("../JsonExemplu/exampleArray.json");

    if (!file2.exists()) 
        qDebug()<<"Fisierul nu a fost gasit ";
        exit(1);
    

    if(!file2.open(QIODevice::ReadOnly))
        qDebug()<<"Nu s-a putut deschide fisierul JSON ";
        exit(1);
    

    QTextStream file_text(&file2);
    QString json_string;
    json_string = file_text.readAll();
    file2.close();
    QByteArray json_bytes = json_string.toLocal8Bit();

    auto json_doc=QJsonDocument::fromJson(json_bytes);

    if(!json_doc.isArray())
        qDebug() << "Formatul nu e de tip arrray.";
        exit(1);
    

    QJsonArray json_array = json_doc.array();

    if(json_array.isEmpty())
        qDebug() << "JSON gol";
        exit(1);
    


    QVariantList root_map = json_array.toVariantList();
    QVariantMap stat_map = root_map["nume"].toMap();
    QVariantMap stat_map2 = root_map["statistici"].toMap();
    QVariantMap stat_map3 = root_map["inventar"].toMap();

    QStringList key_list = stat_map.keys();

    for(int i=0; i< json_array.count(); ++i)
        QString key=key_list.at(i);
        QString stat_val = stat_map[key.toLocal8Bit()].toString();
         qDebug() << key << ": " << stat_val;
    



【问题讨论】:

您确定您的 JSON 数据有效吗?我认为不是。 你是对的,json 有一些错误。更新为有效版本。问题依然存在 【参考方案1】:

问题是您将QJsonArray 转换为变体列表。但是,您将该列表视为地图 - 当然,这不会编译。要解决此问题,您需要使用适当的QList API,即:

QVariantList root_map = json_array.toVariantList(); // This is a list, not a map!

// There are three items in the list.
// The code below can be put into a loop.
QVariantMap stat_map = root_map.at(0).toMap();
QVariantMap stat_map2 = root_map.at(1).toMap();
QVariantMap stat_map3 = root_map.at(2).toMap();

QStringList key_list = stat_map.keys();

for (int i = 0; i< key_list.count(); ++i)

  QString key = key_list.at(i);
  QString stat_val = stat_map[key.toLocal8Bit()].toString();

【讨论】:

以上是关于QT如何解析数组json中的对象的主要内容,如果未能解决你的问题,请参考以下文章

如何解析这个 JSON 文件? (Qt)

QT解析和组装json

在Qt中如何通过QJson 解析json数据

如何使用 Newtonsoft.Json 将包含数组数组的 json 对象解析为 C# 中的对象列表?

如何在 Ios 中解析数组数据中的嵌套 Json 对象

Qt--解析Json