How to create/read/write JSON files in Qt5

后端 未结 3 1689
予麋鹿
予麋鹿 2020-12-02 07:18

Qt5 has a new JSON parser and I want to use it. The problem is that it isn\'t too clear about what the functions do in layman\'s terms and how to write code with it. That or

相关标签:
3条回答
  • 2020-12-02 07:38

    An example on how to use that would be great. There is a couple of examples at the Qt forum, but you're right that the official documentation should be expanded.

    QJsonDocument on its own indeed doesn't produce anything, you will have to add the data to it. That's done through the QJsonObject, QJsonArray and QJsonValue classes. The top-level item needs to be either an array or an object (because 1 is not a valid json document, while {foo: 1} is.)

    0 讨论(0)
  • 2020-12-02 07:39

    Example: Read json from file

    /* 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" 
    

    Example: Read json from string

    Assign json to string as below and use the readJson() function shown before:

    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" 
    
    0 讨论(0)
  • 2020-12-02 07:47

    Sadly, many JSON C++ libraries have APIs that are non trivial to use, while JSON was intended to be easy to use.

    So I tried jsoncpp from the gSOAP tools on the JSON doc shown in one of the answers above and this is the code generated with jsoncpp to construct a JSON object in C++ which is then written in JSON format to 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;
    

    and this is the code generated by jsoncpp to parse JSON from std::cin and extract its values (replace USE_VAL as needed):

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

    This code uses the JSON C++ API of gSOAP 2.8.28. I don't expect people to change libraries, but I think this comparison helps to put JSON C++ libraries in perspective.

    0 讨论(0)
提交回复
热议问题