Подтвердить что ты не робот

Как создавать/читать/записывать файлы JSon в Qt5

Qt5 имеет новый парсер JSon, и я хочу его использовать. Проблема в том, что не слишком ясно, что делают функции в неспециалистских терминах и как писать код с ним. Это или я мог бы прочитать это неправильно.

Я хочу знать код создания Json файла в Qt5 и что означает "инкапсуляция".

4b9b3361

Ответ 1

Пример: чтение json из файла

/* 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();
   }

OUTPUT

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" 

Пример: чтение json из строки

Назначьте json для строки, как показано ниже, и используйте функцию readJson(), показанную ранее:

val =   
'  {
       "appDesc": {
          "description": "SomeDescription",
          "message": "SomeMessage"
       },
       "appName": {
          "description": "Home",
          "message": "Welcome",
          "imp":["awesome","best","good"]
       }
    }';

OUTPUT

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" 

Ответ 2

К сожалению, многие библиотеки JSON С++ имеют API, которые нетривиальны в использовании, тогда как JSON был прост в использовании.

Итак, я попробовал jsoncpp из gSOAP tools на документ JSON, показанный в одном из ответов выше, и это код, сгенерированный с помощью jsoncpp, для создания объекта JSON в С++, который затем записывается в формате 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;

и это код, созданный jsoncpp для разбора JSON из std:: cin и извлечения его значений (при необходимости замените USE_VAL):

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]);
  }
}

Этот код использует API JSON С++ для gSOAP 2.8.28. Я не ожидаю, что люди изменят библиотеки, но я думаю, что это сравнение помогает размещать библиотеки JSON С++ в перспективе.

Ответ 3

Пример того, как использовать это было бы здорово. На форуме Qt есть несколько примеров, но вы правы, что официальную документацию следует расширять.

QJsonDocument сам по себе ничего не производит, вам придется добавить к нему данные. Это делается через классы QJsonObject, QJsonArray и QJsonValue. Элемент верхнего уровня должен быть либо массивом, либо объектом (поскольку 1 не является допустимым json-документом, а {foo: 1} is.)