2017-04-18 3 views
1

J'ai un objet QMap et je voudrais le convertir en JSON. Je suis confus comment je pourrais accomplir cela.Convertir QMap en JSON

Je lis la documentation QT disant que je peux utiliser QDataStream pour convertir QMap en JSON, mais QDataStream semble convertir des fichiers: http://doc.qt.io/qt-4.8/datastreamformat.html

// c++ 
QMap<QString, int> myMap; 
+0

Vous ouvrez un 'QFile', utiliser comme argument pour construire une nouvelle' QDataStream', puis utilisez l'opérateur '<<' pour sérialiser 'myMap'. – rwols

Répondre

4

Il serait plus facile de convertir la carte à QVariantMap qui peut automatiquement être converti en document JSON:

QMap<QString, int> myMap; 
QVariantMap vmap; 

QMapIterator<QString, int> i(myMap); 
while (i.hasNext()) { 
    i.next(); 
    vmap.insert(i.key(), i.value()); 
} 

QJsonDocument json = QJsonDocument::fromVariant(vmap); 

La même chose peut être utilisé pour créer un QJsonObject si vous voulez, via la méthode statique QJsonObject::fromVariant() . Bien que pour QJsonObject vous pouvez ignorer la conversion à l'étape de carte variante et remplir simplement l'objet manuellement comme vous itérer la carte:

QMap<QString, int> myMap; 
QJsonObject json; 

QMapIterator<QString, int> i(myMap); 
while (i.hasNext()) { 
    i.next(); 
    json.insert(i.key(), i.value()); 
}  
+0

Cela ne prend pas en charge la hiérarchie de l'arborescence JSON. Tous les nœuds seront dans un niveau. –

+0

@DmitrySazonov - la carte n'est pas un arbre. – dtech

+0

Je veux dire, quand vous avez une carte de variantes, où variante peut être une valeur ou une autre carte. –

1

Si vous utilisez Qt 5.5 ou supérieur, vous pouvez utiliser QJsonDocument::fromVariant, votre carte pourrait être facilement converti en un QVariantMap. Si ce n'est pas le cas, essayez QJson

Dans ce but, vous recherchez la sérialisation QMAP, voir ce lien: Serialization Qt. Essayez de mettre en place le constructeur avec un QByteArray, quelque chose comme ceci:

QByteArray serializeMap(const QMap<QString, int>& map) { 
     QByteArray buffer; 
     QDataStream stream(&buffer, QIODevice::WriteOnly); 
     out << map; 
     return out; 
    } 

C'est, sérialisera votre carte dans un Wich QByteArray pourrait être facilement converti en un QString ou std :: string.