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 函数来解析。
- JSON.parse(): 将一个 JSON 字符串转换为 JavaScript 对象。
- JSON.stringify(): 于将 JavaScript 值转换为 JSON 字符串。
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、菜鸟教程