void MainWindow::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) { QJsonValue jsonObj = current->data(0, Qt::UserRole).toJsonValue(); QJsonValue::Type jsonType = jsonObj.type(); switch(jsonType) { case QJsonValue::Bool: ui->boolButton->setChecked(jsonObj.toBool()); break; case QJsonValue::Double: ui->doubleValue->setValue(jsonObj.toDouble()); break; case QJsonValue::String: ui->stringEdit->document()->setPlainText(jsonObj.toString()); break; case QJsonValue::Array: { QJsonArray arr = jsonObj.toArray(); int count = arr.count(); ui->arrayList->clear(); for(int i = 0; i < count; ++i) { QString label = renderJsonValue(arr.at(i)); ui->arrayList->addItem(label); } } break; case QJsonValue::Object: { QJsonObject obj = jsonObj.toObject(); ui->objectTable->setRowCount(obj.count()); int row = 0; for(QJsonObject::ConstIterator i = obj.begin(); i != obj.end(); ++i, ++row) { QTableWidgetItem *keyItem = new QTableWidgetItem(i.key()); QJsonValue val = i.value(); QTableWidgetItem *valItem = new QTableWidgetItem(renderJsonValue(val)); ui->objectTable->setItem(row, 0, keyItem); ui->objectTable->setItem(row, 1, valItem); } } break; default: break; } ui->typeSelector->setCurrentIndex(jsonObj.type() - 1); }
void MainWindow::buildJsonTree(QTreeWidgetItem *parent, QJsonValue &obj, QString key = "") { QTreeWidgetItem *toAdd = NULL; switch(obj.type()) { case QJsonValue::Bool: case QJsonValue::Double: case QJsonValue::String: case QJsonValue::Undefined: case QJsonValue::Null: toAdd = createJsonTreeLeaf(parent, obj, key); break; case QJsonValue::Array: { toAdd = new QTreeWidgetItem(parent); QJsonArray array = obj.toArray(); int count = array.count(); toAdd->setText(0, key+"["+QString::number(count)+"]"); for(int i = 0; i < count; ++i) { QJsonValue val = array.at(i); buildJsonTree(toAdd, val, QString::number(i)+" : "); } break; } case QJsonValue::Object: { toAdd = new QTreeWidgetItem(parent); QJsonObject object = obj.toObject(); int count = object.count(); toAdd->setText(0, key+"{"+QString::number(count)+"}"); for(QJsonObject::ConstIterator i = object.begin(); i != object.end(); ++i) { QJsonValue val = i.value(); buildJsonTree(toAdd, val, i.key()+" : "); } break; } default: break; } toAdd->setData(0, Qt::UserRole, QVariant(obj)); parent->addChild(toAdd); }
ProductRule *JsonParser::getProductRuleFromText(QString text){ int majorVersion = -1; int minorVersion = -1; QString product = ""; QList<QString> *groupList = NULL; QMap<QString, QList<QString> > *groupRegexMap = NULL; QMap<QString, QList<QString> > *groupHighlightMap = NULL; QList<QString> *layerList = NULL; QMap<QString, QList<QString> > *layerMap = NULL; bool success = false; QString failReason = ""; do{ // convert qstring to json object QJsonObject root = QJsonDocument::fromJson(text.toUtf8()).object(); if(root.count() == 0){ failReason = QString("json syntax might be wrong."); break; } // root level if(!root.contains(KEY_MAJOR_VERSION)) { failReason = QString("KEY %1 doesn't exist on root level.").arg(KEY_MAJOR_VERSION); break; } bool majorOK; majorVersion = root.value(KEY_MAJOR_VERSION).toString().toInt(&majorOK); if(!majorOK){ failReason = "major version isn't Integer value"; break; } if(!root.contains(KEY_MINOR_VERSION)){ failReason = QString("KEY %1 doesn't exist on root level.").arg(KEY_MINOR_VERSION); break; } bool minorOK; minorVersion = root.value(KEY_MINOR_VERSION).toString().toInt(&minorOK); if(!minorOK){ failReason = "minor version isn't Integer value"; break; } if(!root.contains(KEY_PRODUCT)) { failReason = QString("KEY %1 doesn't exist on root level.").arg(KEY_PRODUCT); break; } product = root.value(KEY_PRODUCT).toString(); // group if(!root.contains(KEY_GROUP)) { failReason = QString("KEY %1 doesn't exist on root level.").arg(KEY_GROUP); break; } QJsonArray groupArray = root.value(KEY_GROUP).toArray(); groupList = getGroupList(groupArray); if(groupList == NULL){ failReason = "Iteration fail on getGroupList()"; break; } groupRegexMap = getGroupRegexMap(groupArray); if(groupRegexMap == NULL){ failReason = "Iteration fail on getGroupRegexMap()"; break; } groupHighlightMap = getGroupHighlightMap(groupArray); if(groupHighlightMap == NULL){ failReason = "Iteration fail on getGroupHighlightMap()"; break; } // layer if(!root.contains(KEY_LAYER)) { failReason = QString("KEY %1 doesn't exist on root level.").arg(KEY_LAYER); break; } QJsonArray layerArray = root.value(KEY_LAYER).toArray(); layerList = getLayerList(layerArray); if(layerList == NULL){ failReason = "Iteration fail on getLayerList()"; break; } layerMap = getLayerMap(layerArray); if(layerMap == NULL){ failReason = "Iteration fail on getLayerMap()"; break; } // all OK. success = true; }while(false); if(success){ return new ProductRule(majorVersion, minorVersion, product, groupList, groupRegexMap, groupHighlightMap, layerList, layerMap); }else{ qDebug() << failReason; return NULL; } }
void MainWindow::LoadJSON(QString fileName) { QFile jsonFile(fileName); if(!jsonFile.open(QIODevice::ReadOnly | QIODevice::Text)) { ui->statusBar->showMessage("Could not open file: " + fileName); return; } QByteArray rawJson = jsonFile.readAll(); ui->textEdit->setText(QString(rawJson)); QJsonParseError error; doc = new QJsonDocument(QJsonDocument::fromJson(rawJson, &error)); if(error.error != QJsonParseError::NoError) { ui->statusBar->showMessage("Failed to parse file: " + error.errorString()); delete doc; doc = NULL; return; } /* QJsonObject root = doc->object(); for(QJsonObject::ConstIterator i = root.begin(); i != root.end(); ++i) { QTreeWidgetItem *toAdd = new QTreeWidgetItem(); toAdd->setText(0, i.key()); ui->treeWidget->addTopLevelItem(toAdd); } */ QTreeWidgetItem *root = new QTreeWidgetItem(); QString rootId = "root"; QJsonValue rootVal; if(doc->isArray()) { QJsonArray array = doc->array(); rootVal = QJsonValue(array); int count = array.count(); rootId += "["+QString::number(count)+"]"; for(int i = 0; i < count; ++i) { QJsonValue val = array.at(i); buildJsonTree(root, val, QString::number(i)+" : "); } } else if(doc->isObject()) { QJsonObject object = doc->object(); rootVal = QJsonValue(object); rootId += "{"+QString::number(object.count())+"}"; for(QJsonObject::ConstIterator i = object.begin(); i != object.end(); ++i) { QJsonValue val = i.value(); buildJsonTree(root, val, i.key()+" : "); } } else { rootId = "Null or Undefined root object"; return; } root->setText(0, rootId); root->setData(0, Qt::UserRole, QVariant(rootVal)); ui->treeWidget->addTopLevelItem(root); ui->treeWidget->setCurrentItem(root); }