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.

48
demandé sur MBach 2013-04-09 07:59:19

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" 
86
répondu Umasankar Natarajan 2017-01-20 12:42:17

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.

1
répondu Dr. Alex RE 2016-02-03 19:51:32

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.)

0
répondu Jan Kundrát 2016-08-23 08:55:50