Qt之JSON语法以及简单的使用

本文深入浅出地介绍了JSON语法及其与XML的区别,重点讲解了Qt中的QJsonObject、QJsonArray等类的使用方法,包括创建、解析、操作JSON对象和数组,以及Qt JSON在实际项目中的应用实例。
摘要由CSDN通过智能技术生成

1、JSON语法

JSON 语法是 JavaScript 对象表示语法的子集。

1.1、JSON语法规则

  • 数据在名称/值对中,由冒号: 分割,书写格式为:key : value
  • 数据和数据之间由逗号分隔,书写格式为:{key1 : value1,key2 : value2,key3 : value3}
  • 大括号 {} 保存对象,书写格式为:{key1 : value1,key2 : value2,key3 : value3}
  • 中括号 [] 保存数组,数组可以包含多个对象,书写格式为:[{key1 : value1,key2 : value2},{key11 : value11,key21 : value21}]
  • JSON 对象使用在大括号({})中书写。
  • 对象可以包含多个 key/value(键/值)对。
  • key 必须是字符串,value 可以是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)。
  • JSON对象可嵌套,JSON对象中可以包含其他JSON对象
  • JSON数组可嵌套,JSON数组中可以包含其他JSON数组或者对象

1.2、JSON值

JSON 值可以是:

  • 数字(整数或浮点数),例如:{"age": 12}
  • 字符串(在双引号中),例如:{"name": root}
  • 逻辑值(true 或 false),例如:{"error": true}
  • 数组(在中括号中),例如:{"name": root,"age":12}
  • 对象(在大括号中),例如:{"data" :[ {"name": root,"age":12},{"name": admin,"age":13}]}
  • null ,例如:{"error_code": null}

1.3、访问对象值

myObj = { "name":"root", "age":12 };
x = myObj.name;//结果root
x = myObj["name"];//结果root

1.4、修改对象值

myObj = { "name":"root", "age":12 };
x = myObj.name;//结果root
myObj["name"] = "admin";
x = myObj.name;//结果admin

1.5、删除对象属性

delete myObj.name;
delete myObj["name"];

 1.6、访问对象中的数组

myObj = { "name":"root", "age":12 ,"phone":["1","0","0","8","6"]};
x = myObj.phone[0];//1
x = myObj.phone;//结果1,0,0,8,6

1.7、修改对象中的数组

myObj.phone[0] = "2";

1.8、删除对象中的数组 

delete myObj.phone[1];

2、JSON和XML的区别

2.1、JSON 与 XML 的相同之处:

  • JSON 和 XML 数据都是 "自我描述" ,都易于理解。
  • JSON 和 XML 数据都是有层次的结构
  • JSON 和 XML 数据可以被大多数编程语言使用

2.2、JSON 与 XML 的不同之处:

  • JSON 不需要结束标签
  • JSON 更加简短
  • JSON 读写速度更快
  • JSON 可以使用数组

2.3、最JSON 与 XML 的大的不同是

XML 需要使用 XML 解析器来解析,JSON 可以使用标准的 JavaScript 函数来解析。

2.4、为什么 JSON 比 XML 更好?

XML 比 JSON 更难解析。

JSON 可以直接使用现有的 JavaScript 对象解析。

针对 AJAX 应用,JSON 比 XML 数据加载更快,而且更简单:

使用 XML

  • 获取 XML 文档
  • 使用 XML DOM 迭代循环文档
  • 接数据解析出来复制给变量

使用 JSON

  • 获取 JSON 字符串
  • JSON.Parse 解析 JSON 字符串

3、Qt-JSON的使用

qt的json的使用会与json教程的语法有点出入,但是本质只是不同编译器对其进行的封装

3.1、Qt中的提供的JSON相关类:

3.1.1、QJsonDocument

QJsonDocument既可以从一个基于文本表示的UTF-8编码,又可以从Qt自己的二进制格式读取和写入这个文件。JSON文档可以从它的基于文本的表示使用QJsonDocument::fromJson()转换为QJsonDocument,用.toJSON()将其转换回文字。解析器非常快速和高效,将JSON转换为二进制表示。

3.1.2、QJsonObject

QJsonObject类用于封装JSON对象。JSON对象是键值对,其中键是唯一的字符串,其值由QJsonValue代表。一个QJsonObject可以从QVariantMap转换/被转换。

3.1.3、QJsonArray

QJsonArray类用于封装JSON数组。一个JSON数组列表值。该列表可以通过从阵列插入和移除QJsonValue的操纵。一个QJsonArray可以从QVariantList转换为/被转换。QJsonDocument有效解析后的文档可以使用!iSNull()判断。使用isArray()和isObject()来判断是否包含一个数组或对象。文档中包含的数组或对象可以使用array()或object()进行检索,然后读取或操纵。

3.1.4、QJsonParseError

用于在JSON解析期间报告错误

3.1.5、QJsonValue

代表具体的值,值可以是QJsonObject,也可以是QJsonArray(可用isObject()和isArray()方法来判断),或者其他类型

3.2、QJsonObject代码

#include <QApplication>
#include <QDebug>
#include <QJsonObject>
#include <QJsonDocument>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
 
    /*生成Json*/
    QJsonObject json;
    json.insert("name", QString("Qt"));
    json.insert("version", 5);
    json.insert("windows", true);
 
    QJsonDocument document;
    document.setObject(json);
    QByteArray byte_array = document.toJson(QJsonDocument::Compact);
    QString json_str(byte_array);
    qDebug()<<"生成Json:"<<json_str;
 
    /*解析Json*/
    QJsonParseError json_error;
    QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, &json_error);
    if(json_error.error == QJsonParseError::NoError)
    {
        if(parse_doucment.isObject())  //判断是否是对象
        {
            QJsonObject obj = parse_doucment.object();
            if(obj.contains("name"))
            {
                QJsonValue name_value = obj.take("name");
                if(name_value.isString())
                {
                    QString name = name_value.toString();
 
                    qDebug()<<"name "<<name;
                }
            }
            if(obj.contains("version"))
            {
                QJsonValue version_value = obj.take("version");
                if(version_value.isDouble())
                {
                    int version = version_value.toVariant().toInt();
 
                    qDebug()<<"version "<<version;
                }
            }
            if(obj.contains("windows"))
            {
                QJsonValue version_value = obj.take("windows");
                if(version_value.isBool())
                {
                    bool flag = version_value.toBool();
                    qDebug()<<"windows "<<flag;
                }
            }
        }
    }
 
    return a.exec();
}

3.3、QJsonArray代码

#include <QApplication>
#include <QDebug>
#include <QJsonArray>
#include <QJsonValue>
#include <QJsonDocument>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    /*生成Json*/
    QJsonArray json;
    json.insert(0, QString("Qt"));
    json.insert(1, QString("version"));
    json.insert(2, true);
 
    QJsonDocument document;
    document.setArray(json);
    QByteArray byte_array = document.toJson(QJsonDocument::Compact);
    QString json_str(byte_array);
    qDebug()<<"生成Json:"<<json_str;
    /*解析Json*/
    QJsonParseError json_error;
    QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array, &json_error);
    if (json_error.error == QJsonParseError::NoError)
    {
        if (parse_doucment.isArray())   //判断是否是数组
        {
            QJsonArray array = parse_doucment.array();
            int size = array.size();
            for (int i=0; i < size; i++)
            {
                QJsonValue value = array.at(i);
                if (value.isString())
                {
                    QString name = value.toString();
 
                    qDebug()<<"数组索引:"<<i<<", name:"<<name;
                }
                else if (value.isBool())
                {
                    bool flag = value.toBool();
 
                    qDebug()<<"数组索引:"<<i<<", flag:"<<flag;
                }
            }
        }
    }
 
    return a.exec();
}

 

抄袭:Qt之简单使用Json菜鸟教程

 

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值