Comment créer / lire / écrire des fichiers JSon dans Qt5
Qt5 a un nouvel analyseur JSon et je veux l'utiliser. Le problème est qu'il n'est pas trop clair sur ce que les fonctions font en termes simples et comment écrire du code avec. Ça ou je pourrais le lire mal.
Je veux connaître le code sur la création d'un fichier Json dans Qt5 et ce que "encapsule" signifie.
3 réponses
Exemple: lire json à partir du fichier
/* test.json */
{
"appDesc": {
"description": "SomeDescription",
"message": "SomeMessage"
},
"appName": {
"description": "Home",
"message": "Welcome",
"imp":["awesome","best","good"]
}
}
void readJson()
{
QString val;
QFile file;
file.setFileName("test.json");
file.open(QIODevice::ReadOnly | QIODevice::Text);
val = file.readAll();
file.close();
qWarning() << val;
QJsonDocument d = QJsonDocument::fromJson(val.toUtf8());
QJsonObject sett2 = d.object();
QJsonValue value = sett2.value(QString("appName"));
qWarning() << value;
QJsonObject item = value.toObject();
qWarning() << tr("QJsonObject of description: ") << item;
/* in case of string value get value and convert into string*/
qWarning() << tr("QJsonObject[appName] of description: ") << item["description"];
QJsonValue subobj = item["description"];
qWarning() << subobj.toString();
/* in case of array get array and convert into string*/
qWarning() << tr("QJsonObject[appName] of value: ") << item["imp"];
QJsonArray test = item["imp"].toArray();
qWarning() << test[1].toString();
}
SORTIE
QJsonValue(object, QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"}) )
"QJsonObject of description: " QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"})
"QJsonObject[appName] of description: " QJsonValue(string, "Home")
"Home"
"QJsonObject[appName] of value: " QJsonValue(array, QJsonArray(["awesome","best","good"]) )
"best"
Exemple: lire json à partir de la chaîne
Affectez json à la chaîne comme ci-dessous et utilisez la fonction readJson()
affichée précédemment:
val =
' {
"appDesc": {
"description": "SomeDescription",
"message": "SomeMessage"
},
"appName": {
"description": "Home",
"message": "Welcome",
"imp":["awesome","best","good"]
}
}';
SORTIE
QJsonValue(object, QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"}) )
"QJsonObject of description: " QJsonObject({"description": "Home","imp": ["awesome","best","good"],"message": "YouTube"})
"QJsonObject[appName] of description: " QJsonValue(string, "Home")
"Home"
"QJsonObject[appName] of value: " QJsonValue(array, QJsonArray(["awesome","best","good"]) )
"best"
Malheureusement, de nombreuses bibliothèques JSON C++ ont des API non triviales à utiliser, alors que JSON était destiné à être facile à utiliser.
J'ai donc essayé jsoncpp {[7] } à partir des outils gSOAP sur le document JSON montré dans l'une des réponses ci-dessus et c'est le code généré avec jsoncpp pour construire un objet JSON en C++ qui est ensuite écrit au format JSON à std:: cout:
value x(ctx);
x["appDesc"]["description"] = "SomeDescription";
x["appDesc"]["message"] = "SomeMessage";
x["appName"]["description"] = "Home";
x["appName"]["message"] = "Welcome";
x["appName"]["imp"][0] = "awesome";
x["appName"]["imp"][1] = "best";
x["appName"]["imp"][2] = "good";
std::cout << x << std::endl;
Et c'est le code généré par jsoncpp pour analyser JSON à partir de std:: cin et extraire ses valeurs (remplacer USE_VAL
comme nécessaire):
value x(ctx);
std::cin >> x;
if (x.soap->error)
exit(EXIT_FAILURE); // error parsing JSON
#define USE_VAL(path, val) std::cout << path << " = " << val << std::endl
if (x.has("appDesc"))
{
if (x["appDesc"].has("description"))
USE_VAL("$.appDesc.description", x["appDesc"]["description"]);
if (x["appDesc"].has("message"))
USE_VAL("$.appDesc.message", x["appDesc"]["message"]);
}
if (x.has("appName"))
{
if (x["appName"].has("description"))
USE_VAL("$.appName.description", x["appName"]["description"]);
if (x["appName"].has("message"))
USE_VAL("$.appName.message", x["appName"]["message"]);
if (x["appName"].has("imp"))
{
for (int i2 = 0; i2 < x["appName"]["imp"].size(); i2++)
USE_VAL("$.appName.imp[]", x["appName"]["imp"][i2]);
}
}
CE code utilise L'API JSON C++ de gSOAP 2.8.28. Je ne m'attends pas à ce que les gens changent de bibliothèques, mais je pense que cette comparaison aide à mettre les bibliothèques JSON C++ en perspective.
Un exemple sur la façon d'utiliser ce serait génial. Il y a quelques exemples sur le forum Qt , mais vous avez raison que la documentation officielle devrait être étendue.
QJsonDocument
en soi, en effet, ne produit rien, vous devrez y ajouter les données. C'est fait à travers le QJsonObject
, QJsonArray
et QJsonValue
classes. L'élément de niveau supérieur doit être un tableau ou un objet (car 1
n'est pas un document JSON valide, alors que {foo: 1}
l'est.)