alin的学习之路: Json简介和Qt中的Json相关类和函数

alin的学习之路: Json简介和Qt中的Json相关类和函数

JSON(JavaScrip Object Notation)一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

总结:

  • Json是一种数据格式, 不是语言, 与语言无关
  • 使用Json主要是用于数据的网络传输, 或者数据的持久化操作(写磁盘文件)

1. Json格式

Json有两种格式: Json数组, Josn对象, 这两种格式可以相互嵌套使用

Json格式的文件一般使用的文件后缀为: .json

  • 在一个Json文件中, 最顶层的结构只能有一个(要么是数组要么是对象), 不能并列出现
    • 内部可以嵌套或者并列, 但是顶层结构只能出现一种结构
  • Json数组

    // 语法: Json数组使用 []表示, 匿名的, 里边的元素之间以逗号间隔, 最后一个元素后边没有逗号
    //		在一个Josn数组中可以同时出现多种类型的元素:
    //			- 整形, 浮点型, 字符串, 布尔类型, NULL, Json数组, Json对象
    // 举例:
    [12, 12.34 "hello,world", true, false, NULL, [1,2], {"hello":"world"}]
    
  • Json对象

    // 语法: Json对象是使用 {} 来表示, 匿名的, 里边的每一个元素是一个键值对 (key-value)
    // 		元素和元素之间使用逗号间隔, 最后一个元素后边没有逗号
    //		对于每个键值对来说 (key 和 value之间使用冒号间隔): 
    //			- key: 必须是字符串类型, key就是对valie值的描述
    //			- value: 整形, 浮点型, 字符串, 布尔类型, NULL, Json数组, Json对象
    // 举例: 描述一个人的信息
    {
        "ID":123,
        "Name":"张三",
        "Sex":"man",
        "Age":23.5,
        "Family":{
            "Father":"杨过",
            "Mother":"小龙女",
            "Sister":["小红", "小绿"]
        },
        "IsMarried":true
    }
    

2. Qt中的Json操作

QT中提供的Json操作类一共有4个:

  • QJsonValue
    • 对Json支持的数据类型进行了包装, 得到了一个新的同一的类型
  • QJsonObject
    • Json对象操作类
  • QJsonArray
    • Json数组的操作类
  • QJsonDocument
    • Json文档对象, 类型转换
      • json数组/对象[内存中的一数据块, 不是字符串] -> 字符串
      • 字符串 -> json数组/对象
  • QJsonValue

    • 将json支持的数据类型进行封装 -> 统一的类型

    在这里插入图片描述

    • 如果判断这个对象中存储了什么类型的数据呢?

    在这里插入图片描述

    • 如何通过这个对象得到实际的数据类型?

    在这里插入图片描述

  • QJsonObject-> 封装了json的对象

    // 如何创建json对象
    QJsonObject::QJsonObject();	// 构造空对象
    
    // 如何将键值对添加到空对象中
    iterator QJsonObject::insert(const QString &key, const QJsonValue &value);
    
    // 如何知道对象中键值对个数
    int QJsonObject::count() const;
    int QJsonObject::size() const;
    int QJsonObject::length() const;
    
    // 遍历
    // 1. 使用相关的迭代器函数
    // 2. 使用 [] 的方式遍历, 类似于遍历数组, []中是键值
    // 3. 先得到对象中所有的键值, 在遍历键值列表, 通过key得到value值
    QStringList QJsonObject::keys() const;
    
    // 通过key得到value
    QJsonValue QJsonObject::value(const QString &key) const;	// utf8
    QJsonValue QJsonObject::value(QLatin1String key) const;	// 字符串不支持中文
    QJsonValue QJsonObject::operator[](const QString &key) const;
    QJsonValue QJsonObject::operator[](QLatin1String key) const;
    
    // 删除键值对
    void QJsonObject::remove(const QString &key);
    QJsonValue QJsonObject::take(const QString &key);	// 返回key对应的value值
    
    // 通过key进行查找
    iterator QJsonObject::find(const QString &key);
    bool QJsonObject::contains(const QString &key) const;
    
  • QJsonArray

    // 得到空的数组对象
    QJsonArray::QJsonArray();
    
    // 添加数据
    void QJsonArray::append(const QJsonValue &value);	// 在尾部追加
    void QJsonArray::insert(int i, const QJsonValue &value); // 插入到 i 的位置之前
    iterator QJsonArray::insert(iterator before, const QJsonValue &value);
    void QJsonArray::prepend(const QJsonValue &value); // 添加到数组头部
    void QJsonArray::push_back(const QJsonValue &value); // 添加到尾部
    void QJsonArray::push_front(const QJsonValue &value); // 添加到头部
    
    // 计算数组原始个数
    int QJsonArray::count() const;
    int QJsonArray::size() const;
    
    // 取值
    QJsonValue QJsonArray::at(int i) const;
    QJsonValue QJsonArray::first() const; // 头部元素
    QJsonValue QJsonArray::last() const; // 尾部元素
    QJsonValueRef QJsonArray::operator[](int i);
    
    // 删除
    iterator QJsonArray::erase(iterator it);
    void QJsonArray::pop_back();	// 删除尾部
    void QJsonArray::pop_front();	// 删除头部
    void QJsonArray::removeAt(int i); 	// 删除i位置的元素
    void QJsonArray::removeFirst(); // 删除头部
    void QJsonArray::removeLast(); // 删除尾部
    QJsonValue QJsonArray::takeAt(int i); 	// 删除i位置的原始, 并返回删除的元素的值
    
    
  • QJsonDocument

    QJsonObject 和 QJsonArray这两个对象中的数据是不能直接转换为 字符串类型的

    • 如果要进行数据传输, 数据的持久化, 操作的都是字符串类型 而不是 QJsonObject 和 QJsonArray类型
    • 需要通过一个Json文档类进行二者之间的转换
      • QJsonObject 和 QJsonArray ----> 字符串
      • 字符串 —> QJsonObject 和 QJsonArray
    • QJsonObject 和 QJsonArray ----> 字符串

      // 1. 创建QJsonDocument对象
      QJsonDocument::QJsonDocument(const QJsonObject &object);
      QJsonDocument::QJsonDocument(const QJsonArray &array);
      
      // 2. 将文件对象中的数据进行序列化
      QByteArray QJsonDocument::toBinaryData() const;	// 二进制格式的json字符串
      QByteArray QJsonDocument::toJson(JsonFormat format = Indented) const;	// 文本格式
      
      // 3. 使用得到的字符串进行数据传输, 或者磁盘文件持久化
      
    • 字符串 —> QJsonObject 和 QJsonArray

      // 将磁盘/网络通信得到的json字符串 -> json对象/json数组
      // 1. 将得到的json格式字符串 ---> json文档对象
      // 		通过 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 解析得到 里边存储的数据
      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值