2015-10-02 5 views
0

Я внедрил код, который будет принимать данные от QLineEdit, и данные будут сохранены в формате json-файла.Порядок сортировки данных QJson

void MainWindow::fileWriteOperationJson() 
{  
    QString filename = "C:/Users/.../Documents/Qt/save.json"; 
    QFile saveFile(filename); 
    saveFile.open(QIODevice::WriteOnly|QIODevice::Text); 

    if (!saveFile.open(QIODevice::WriteOnly)) 
    { 
      qWarning("Couldn't open save file.");  
    } 

    QJsonObject obj; //this is the root 
    QJsonArray personalData;  

    QJsonObject json; 
    json["name"] = ui->nameLineEdit->text(); 
    json["address"] = ui->addressLineEdit->toPlainText(); 

    personalData.append(json); 
    obj["personalData"] = personalData; 

    QTextStream out(&saveFile); 

    out << QJsonDocument(obj).toJson(QJsonDocument::Indented);  

} 

Проблема: Когда я открываю файл JSON, я хочу, чтобы найти мои данные в приведенной ниже форме:

"name" = xyz 
"address" = xyz 

Но я имею результат, как этот,

"address" = xyz 
"name" = xyz 

Как получить этот заказ?

+4

Используйте другой формат. Порядок вещей в Json не важен; это имеет значение только структура. Qt выбирает, чтобы заказать их в алфавитном порядке, и я не верю, что есть какой-либо предоставленный API, чтобы изменить это. То же самое касается реализации Qt XML. – TheDarkKnight

ответ

3

JSON (JavaScript Object Notation) is a lightweight data-interchange format и как таковая, структура важна, но порядок элементов - нет.

Если вам нужно распечатать элементы в определенном порядке, вам необходимо извлечь их из Json в подходящие структуры данных и обработать их самостоятельно.

В качестве альтернативы вы можете сохранить в другом формате, но обратите внимание, что XML Qt будет действовать так же, как Json. Возможно, вам может быть полезнее CSV.

+0

спасибо за предложение. –

2

Qt генерирует данные JSON с ключами, отсортированными по алфавиту. AFAIK, нет возможности обойти его. Вы можете попробовать герметизирующего объекты с одной пары ключ/значение в массив, хотя и сохраняют порядок:

[ 
    {"address": xyz}, 
    {"name": xyz} 
] 

Или вы могли бы попробовать использовать другой формат хранения в целом.

+0

спасибо, я сделаю это. –

0

Основная проблема заключается в том, что QMap не имеет упорядоченной формы. Вот возможное решение с помощью подклассов QVariantMap: может быть предоставлена ​​

#ifndef ORDEREDVARIANTMAP_H 
#define ORDEREDVARIANTMAP_H 

#include <QtCore> 

class OrderedVariantMap : public QMap<QString, QVariant> { 
// Test: 
// OrderedVariantMap test_map; 
// test_map.insert("xxx", 1); 
// test_map.insert("aaa", 2); 
// test_map.insert("kkk", 3); 

// test_map["321"] = 4; 
// test_map["000"] = 5; 
// test_map["123"] = 6; 

// qDebug() << "QMap.keys()" << test_map.keys(); 
// qDebug() << "QMap.orderedKeys()" << test_map.orderedKeys(); 

// QVariant test_variant; 
// test_variant.setValue(test_map); 
// qDebug() << "test_variant.typeName()" << test_variant.typeName(); 
// OrderedVariantMap test_map_recovered = qvariant_cast<OrderedVariantMap>(test_variant); 
// qDebug() << "test_map_recovered.orderedKeys()" << test_map_recovered.orderedKeys(); 

// Test results: 
// QMap.keys() ("000", "123", "321", "aaa", "kkk", "xxx") 
// QMap.orderedKeys() ("xxx", "aaa", "kkk", "321", "000", "123") 
// test_variant.typeName() OrderedVariantMap 
// test_map_recovered.orderedKeys() ("xxx", "aaa", "kkk", "321", "000", "123") 

public: 
    OrderedVariantMap (); 
    ~OrderedVariantMap (); 

void 
clear (); 

void // QMap::iterator 
insert (const QString &key, 
     const QVariant &value); 

QVariant& 
operator[] (const QString &key); 

const QVariant 
operator[] (const QString &key) const; 

const QString 
orderedKey (int index) const; 

const QVariant 
orderedValue (int index) const; 

QStringList 
orderedKeys () const ; 

private: 
    QStringList Ordered_Keys; 

protected: 

}; 

Q_DECLARE_METATYPE(OrderedVariantMap) 

#endif // ORDEREDVARIANTMAP_H 

и

#include "OrderedVariantMap.h" 

OrderedVariantMap::OrderedVariantMap () : QMap () { 

} 

OrderedVariantMap::~OrderedVariantMap () { 

} 

QStringList 
OrderedVariantMap::orderedKeys () const { 
    return Ordered_Keys; 
} 

void 
OrderedVariantMap::clear () { 
    Ordered_Keys.clear(); 
    QMap::clear(); 
} 

void // QMap::iterator 
OrderedVariantMap::insert (const QString &key, 
          const QVariant &value) { 
    Ordered_Keys.append(key); 
    QMap::insert(key, value); 
} 

QVariant& 
OrderedVariantMap::operator[] (const QString &key) { 
    Ordered_Keys.append(key); 
    return QMap::operator [](key); 
} 

const QVariant 
OrderedVariantMap::operator[] (const QString &key) const { 
    return this->value(key); 
} 

const QString 
OrderedVariantMap::orderedKey (int index) const { 
    return Ordered_Keys[index]; 
} 

const QVariant 
OrderedVariantMap::orderedValue (int index) const { 
    return this->value(Ordered_Keys[index]); 
} 

больше функциональных возможностей, например, упорядоченная итератора.

Смежные вопросы