2016-08-05 2 views
1

Je lis la QJsonDocument documentation et j'utilise QJsonDocument avec la ligne suivante:QJsonDocument :: array() et QJsonDocument :: objet()

emit this->ueSignalNewDataArrivedPlaces(QJsonDocument::fromBinaryData(incomingData[0].toByteArray())); 

et je ne comprends pas, après cette ligne, dois-je utiliser QJsonDocument::array() ou QJsonDocument::object(), c'est-à-dire, dans quelles situations QJsonDocument crée-t-il array et dans quelles situations crée-t-il object?

Répondre

3

Un tableau JSON est une liste ordonnée, il est écrit que:

[ <item1>, <item2>, <item3> ] 

alors qu'un objet JSON est une liste nommée, écrit:

{ 
    <name1>: <item1>, 
    <name2>: <item2> 
} 

Dans Qt, un QJsonArray est équivalent à QVariantList (QList<QVariant>) et QJsonObject est équivalent à QVariantMap (QMap<QString, QVariant>).

Lequel vous devez utiliser dépend du fichier que vous analysez. Par exemple, en prenant par exemple Wikipedia:

{ 
    "firstName": "John", 
    "lastName": "Smith", 
    "isAlive": true, 
    "age": 25, 
    "address": { 
    "streetAddress": "21 2nd Street", 
    "city": "New York", 
    "state": "NY", 
    "postalCode": "10021-3100" 
    }, 
    "phoneNumbers": [ 
    { 
     "type": "home", 
     "number": "212 555-1234" 
    }, 
    { 
     "type": "office", 
     "number": "646 555-4567" 
    }, 
    { 
     "type": "mobile", 
     "number": "123 456-7890" 
    } 
    ], 
    "children": [], 
    "spouse": null 
} 

Vous utilisez un QJsonArray pour obtenir la liste des phoneNumbers, chaque élément de phoneNumbers est un QJsonObject cinque 2 valeurs nommées: type et number.

Si votre code vous devez manipuler un élément de JSON, mais vous ne connaissez pas son type que vous pouvez utiliser QJsonValue, qui est l'un des: QJsonObject, QJsonArray, bool, double ou QString

+0

hmm, voilà! Je pensais que 'QJsonObject' est créé à la place de' QJsonArray' si la source de données 'json' contient seulement" un enregistrement ". – KernelPanic

+0

Et puis-je être sûr du format "json" "invalide" si à la fois 'isObject()' et 'isArray()' retourne 'true'? – KernelPanic

+1

@Kernelpanic Vous ne pouvez pas avoir les deux retournant vrai. Votre élément racine ne peut pas être à la fois un tableau et un objet. Si vous voulez la preuve, dans les sources Qt 'QJsonDocument :: isArray()' appelle 'QJsonPrivate :: Base :: isArray()', qui est implémenté comme inline 'bool isArray() const {return! IsObject(); } '. Vous pouvez également rechercher un JSON invalide avec 'QJsonDocument :: isNull()' et avec le second paramètre de 'QJsonDocument :: fromJson()'. –