web-dev-qa-db-fra.com

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 très clair ce que les fonctions font en termes simples et comment écrire du code avec. Cela ou je pourrais lire mal.

Je veux savoir le code sur la création d'un fichier Json dans Qt5 et ce que "encapsule" signifie.

55
Jim Kieger

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 un json de la chaîne

Attribuez json à string comme ci-dessous et utilisez la fonction readJson() indiqué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" 
91
Umasankar Natarajan

Malheureusement, de nombreuses bibliothèques JSON C++ ont des API non simples à utiliser, alors que JSON devait être facile à utiliser.

J'ai donc essayé jsoncpp à partir de outils gSOAP sur le document JSON présenté dans l'une des réponses ci-dessus. Il s'agit du code généré avec jsoncpp pour construire un objet JSON en C++, à savoir puis écrit au format JSON dans 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 (replace USE_VAL comme requis):

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èque, mais je pense que cette comparaison permet de mettre les bibliothèques JSON C++ en perspective.

2
Dr. Alex RE

Un exemple d'utilisation serait génial. Il y a quelques exemples sur le forum Qt , mais vous avez raison de dire que la documentation officielle devrait être élargie.

QJsonDocument à lui seul ne produit rien, vous devrez y ajouter les données. Cela se fait via les classes QJsonObject, QJsonArray et QJsonValue. 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} est.)

0
Jan Kundrát