• qt中json类


    目录

    QJsonValue

     QJsonObject

     QJsonArray

    QJsonDocument

    案例:


    Qt 5.0开始提供了对Json的支持,我们可以直接使用Qt提供的Json类进行数据的组织和解析,下面介绍4个常用的类。

    QJsonValue

    该类封装了JSON支持的数据类型

    • 布尔类型:QJsonValue::Bool
    • 浮点类型(包括整形): QJsonValue::Double
    • 字符串类型: QJsonValue::String
    • Json数组类型: QJsonValue::Array
    • Json对象类型:QJsonValue::Object
    • 空值类型: QJsonValue::Null

    值的类型可以使用 type() 或 isBool()、isString() 等访问器进行查询。同样,可以使用 toBool()、toString() 等将值转换为存储在其中的类型。 

     

     QJsonObject

    JSON 对象是键值对的列表,其中键是唯一字符串,值由 QJsonValue 表示。

    API的使用类似于c++的STL库,支持插入,删除,查找等,也有迭代器。例如:

    QJsonValue QJsonObject::value(QLatin1String key) const;        // 字符串不支持中文

    QJsonValue QJsonObject::take(const QString &key);    // 返回key对应的value值

    QStringList QJsonObject::keys() const;//先得到对象中所有的键值, 在遍历键值列表, 通过key得到value值 

     QJsonArray

    JSON 数组是一个值列表。可以通过在数组中插入和删除 QJsonValue 来操作该列表。

    使用方法也类似与STL中vector等,有迭代器。例如:

    构造函数:

    QJsonDocument

    它封装了一个完整的JSON文档,并且可以从UTF-8编码的基于文本的表示以及Qt自己的二进制格式读取和写入该文档。QJsonObject 和 QJsonArray这两个对象中的数据是不能直接转换为字符串类型的,如果要进行数据传输或者数据的持久化,,我们需要通过一个Json文档类进行二者之间的转换。

    构造函数:

     将文件对象中的数据进行序列化

    // 二进制格式的json字符串
    QByteArray QJsonDocument::toBinaryData() const;     
    // 文本格式
    QByteArray QJsonDocument::toJson(JsonFormat format = Indented) const;    

    字符串 ===> QJsonObject 或者 QJsonArray

    1.将得到的Json格式字符串通过 QJsonDocument 类的静态函数转换为QJsonDocument类对象

    [static] QJsonDocument QJsonDocument::fromBinaryData(const QByteArray &data, DataValidation validation = Validate);
    // 参数文件格式的json字符串
    [static] QJsonDocument QJsonDocument::fromJson(const QByteArray &json, QJsonParseError *error = Q_NULLPTR);

    2.将文档对象转换为json数组/对象

    // 判断文档对象中存储的数据是不是数组
    bool QJsonDocument::isArray() const;
    // 判断文档对象中存储的数据是不是json对象
    bool QJsonDocument::isObject() const
        
    // 文档对象中的数据转换为json对象
    QJsonObject QJsonDocument::object() const;
    // 文档对象中的数据转换为json数组
    QJsonArray QJsonDocument::array() const;

    3.通过调用QJsonArray , QJsonObject 类提供的 API 读出存储在对象中的数据

    案例:

    1. void MainWindow::write()
    2. {
    3. QJsonObject obj;//存储的是键值对,key值是字符串,value是QJsonValue支持的类型,也可以是 QJsonArray,QJsonObject,嵌套使用
    4. obj.insert("Name", "Ace");//隐式类型转换
    5. obj.insert("Sex", "man");
    6. obj.insert("Age", 20);
    7. QJsonObject subObj;
    8. subObj.insert("Father", "Gol·D·Roger");
    9. subObj.insert("Mother", "Portgas·D·Rouge");
    10. QJsonArray array;//JSON 数组是一个值列表。可以通过在数组中插入和删除 QJsonValue 来操作该列表
    11. array.append("Sabo");
    12. array.append("Monkey D. Luffy");
    13. subObj.insert("Brother", array);
    14. obj.insert("Family", subObj);
    15. obj.insert("IsAlive", false);
    16. obj.insert("Comment", "yyds");
    17. QJsonDocument doc(obj);
    18. QByteArray json = doc.toJson();
    19. QFile file("d:\\ace.json");
    20. file.open(QFile::WriteOnly);
    21. file.write(json);
    22. file.close();
    23. }
    24. void MainWindow::read()
    25. {
    26. QFile file("d:\\ace.json");
    27. file.open(QFile::ReadOnly);
    28. QByteArray json = file.readAll();
    29. file.close();
    30. QJsonDocument doc = QJsonDocument::fromJson(json);
    31. if(doc.isObject())//该数据是 QJsonObject数据
    32. {
    33. QJsonObject obj = doc.object();
    34. QStringList keys = obj.keys();//获取对应的key值
    35. for(int i=0; isize(); ++i)
    36. {
    37. QString key = keys.at(i);
    38. QJsonValue value = obj.value(key);//通过key值查找value值
    39. if(value.isBool())
    40. {
    41. qDebug() << key << ":" << value.toBool();
    42. }
    43. if(value.isString())
    44. {
    45. qDebug() << key << ":" << value.toString();
    46. }
    47. if(value.isDouble())
    48. {
    49. qDebug() << key << ":" << value.toInt();
    50. }
    51. if(value.isObject())
    52. {
    53. qDebug()<< key << ":";
    54. again(value);
    55. }
    56. }
    57. }
    58. }
    59. void MainWindow::again( QJsonValue doc)
    60. {
    61. if(doc.isObject())//该数据是 QJsonObject数据
    62. {
    63. QJsonObject subObj = doc.toObject();
    64. QStringList keys =subObj.keys();//获取对应的key值
    65. for(int i=0; isize(); ++i)
    66. {
    67. QString key = keys.at(i);
    68. QJsonValue value = subObj.value(key);//通过key值查找value值
    69. if(value.isBool())
    70. {
    71. qDebug() << key << ":" << value.toBool();
    72. }
    73. if(value.isString())
    74. {
    75. qDebug() << key << ":" << value.toString();
    76. }
    77. if(value.isDouble())
    78. {
    79. qDebug() << key << ":" << value.toInt();
    80. }
    81. if(value.isArray())
    82. {
    83. qDebug()<< key << ":";
    84. QJsonArray array = value.toArray();
    85. for(int i=0;isize();i++)
    86. {
    87. qDebug()<toString();//以提前知道数组存储的是字符串,不然还要再判断
    88. }
    89. }
    90. if(value.isObject())//继续嵌套
    91. {
    92. qDebug()<< key << ":";
    93. again(value);
    94. }
    95. }
    96. }

  • 相关阅读:
    【基础框架】Spring_下
    【JavaWeb】Servlet身份验证过滤器
    互联网架构演进之路
    Jenkins简介及安装配置详解:开启持续集成之旅
    python-opencv之形态学操作(腐蚀和膨胀)原理详解
    Linux安装详解
    分布式链路追踪-skywalking基础
    jdk21本地执行flink出现不兼容问题
    五、DMSQL
    独立站运营中如何提升客户留存率?客户细分很重要!
  • 原文地址:https://blog.csdn.net/m0_64397669/article/details/133519461