JSON:一种轻量级的数据交换格式
一般.json后缀
高效简单
组织数据:用于数据的网络传输
组织数据:用于磁盘文件实现数据的持久化存储
用在登录 记录用户名密码等,下次打开软件,自动填充。
Json数组使用[]表示,[]里面是元素,元素间使用 , 分隔,最后一个元素后面,没有 ,
一个Json数组,支持多种不同的数据类型,包括:整形,浮点型,字符串,json数组,json对象,空值-null(null)
Json数组中嵌套Json数组,父子关系
Json数组嵌套Json对象,Json对象可以嵌套Json数组
[1, 2, 3]
["哈哈","hehe","yiyi"]
[1, 2, 3, true, false, "haha",null]
[
["cat", "狗狗", "河马", 1]//元素类型可以不一致
[1, 3, 5, true]
]
[//外层是Json数组
{//内层是Json对象
"小明":{//属于键值对
"age":19,
"father":"大华",
"sister":"小妹"
}
}
]
Json对象使用{}来描述,每个Json对象可以存储若干个元素,每个元素对应一个键值对(key:value),元素和元素之间使用 , 间隔,最后一个元素后面没有 ,
注意:
1.键值key,必须是字符串,位于同一层级的键值,不能重复(通过键值取出数据value)
2.value值的类型是可选的,整形,浮点型,字符串,json数组,json对象,空值-null(null)
Json描述一个人的信息:
{
"NAME":"ACE",
"Sex":"man",
"Age":20,
"Family":{
"Father":"yiyi",
"brother":["aa","bb","cc"]
},
"IsLive":"true"
}
, 不能乱加,解析会出错
键值不唯一,不能搜到到正确的value
一个Json.json文件中:
1、只能有一个Json数组
2、只能有一个Json对象
3、1,2只能有一个存在:根节点只能有一个
错误案例:
将Json字符串转解析出来 原始数据
Json类 介绍
QJsonDocument(桥梁,转换器的作用)
它封装了一个完整的Json文档,并且可以从UTF-8编码的基于文本的表示以及Qt自己的读取和写入该文档
QJsonArray(Json数组)
Json数组是一个值列表。可以通过从数组中插入和删除QJsonValue来操作该列表
QJsonObject(Json对象)
Json对象是键值对的列表,其中键值是唯一的字符串,值由QJsonValue表示
QJsonValue
该类封装了Json支持的数据类型
封装的数据类型6:
1.bool QJsonValue::Bool
2.double QJsonValue::Double
3.string QJsonVale::String
4.array QJsonValue.:Array
5.object QJsonValue:Object .
6.null QJsonValue::Null
通过构造函数,将6种不同的类型统一,类似,6种类型,放到一个箱子里面
封装了Json中的对象,在里边可以存储多个键值对,为了方便操作,键值为字符串类型,值为QJsonValue类型,关于这个类的使用类似,C++中STL类
QJsonObject内数据使用insert插入,根据key值,自动排序,底层红黑树,升序
6.2.1、创建空的Json对象
QJsonObject::QJsonObject() //构造空对象
6.2.2、将键值对添加到Json对象中
iterator QJsonObject::insert(const QString &key, const QJsonValue &value);//key value
6.2.3、获取对象中,键值对个数
int QJsonObject::count() const;
int QJsonObject::size() const;
int QJsonObject::length() const;
6.2.4、通过key取出value
传入key:得到QJsonObject对象:看看是什么,在使用to方法,得到原始数据
1、QJsonValue QJsonObject:: value(const QString &key) const; //utf-8
2、QJsonValue QJsonObject:: value(QLatin1QString key) const; //字符串不支持中文
3、QJsonValue QJsonObject:: operator[](const QString &key) const; //使用的时候["key值"]
4、QJsonValue QJsonObject:: operator[](QLatin1QString key) const;
6.2.5、删除键值对
void QJsonObject::remove(const QString &key);
QJsonValue QJsonObject::take(const QString &key); //删除键值对后,返回value值
6.2.6、通过key进行查找
iterator QJsonObject::find(const QString &key); //返回的是迭代器,解引用,可以得到数据
bool QJsonObject::contains(const QString &key) const; //查看QJsonObject对象中,是否 存在这个key键值对
6.2.7、遍历方式3种
1.使用迭代器函数
2.使用[],遍历,类似遍历数组,[]中是key
3.先得到对象中所有的键值,在遍历键值列表,通过key得到value
QStringList QJsonObject::keys() const;//得到当前Json对象中所有的key值
QJsonArray里面封装了Json数组,里面存储多个元素,为了方便操作,所有元素类型统一为QJsonValue类型
注意:QJsonArray内元素是无序的,完全按照添加顺序存储。
先添加,放在前面,后添加放在后面。插入,就放在插入的位置。
6.3.1、创建空的Json数组
QJsonArray::QJsonArray() //得到空的Json数组,通过size()方法,返回值为0
6.3.2、添加数据
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); //添加到头部
6.3.3、计算数组内元素的个数
int QJsonArray::count() const;
int QJsonArray::size() const;
6.3.4、从数组中取出某一个元素的值
QJsonValue QJsonArray::at(int i) const; //参数i:为在数组中元素对应的下标 拷贝,不能修改数组内元素的值
QJsonValue QJsonArray::first() const; //头部元素 拷贝
QJsonValue QJsonArray::last() const; //尾部元素 拷贝
QJsonValueRef QJsonArray::operator[](int i);//这里返回的值是引用,可以修改 数组内的值
6.3.5、从数组中删除某一个元素的值
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位置的原始,并返回删除元素的值
6.3.6、遍历
1、使用迭代器遍历(和使用迭代器遍历STL容器一样)
2、使用数组方式遍历
它封住了一个完整的Json文档,并且可以从UTF-8编码的基于文本的表示以及Qt自己的二进制格式读取和写入该文档。
QJsonObject和QJsonArray这两个对象中的数据是不能直接转换为字符串类型的,
如果要进行数据传输或者数据的持久化,操作的都是字符串类型,不是QJsonArray或者QjsonObject类型,
需要使用Json文档进行二者之间的转换。
6.4.1、QJsonArray和QJsonObject->字符串
6.4.2、字符串->QJsonArray和QJsonObject
//写入
QJsonObject obj;
QString str2 = "man";
obj.insert("name",QString("Ace"));
obj.insert("sex",str2);
QJsonObject subobj;
subobj.insert("Father",QString("father"));
subobj.insert("Mother",QString("mother"));
QJsonArray array;
array.append(QString("1"));
array.push_back(QString("2"));
subobj.insert("Brother",array);
obj.insert("Family",subobj);
obj.insert("IsAlive",QString("false"));
obj.insert("Comment",QString("yyds"));
QJsonDocument doc(obj); //将Json对象,转换成Json文档
//显示用
QByteArray json = doc.toJson();
ui.textEdit->setText(json);
/写入文件
QFile file("../my.json");
file.open(QFile::WriteOnly);
file.write(json);
file.close();
//读取文件
QFile file("../my.json");
file.open(QFile::ReadOnly);
QByteArray all = file.readAll();
file.close();
QJsonDocument doc = QJsonDocument::fromJson(all);//转换成文档对象
if (doc.isObject())//可以不做格式判断,因为,解析的时候已经知道是什么数据了
{
QJsonObject obj = doc.object(); //得到Json对象
QStringList keys = obj.keys(); //得到所有key
for (int i = 0; i < keys.size(); i++)
{
QString key = keys.at(i);
QJsonValue value = obj.value(key);
if (value.isBool())
{
qDebug() << key << ":" << value.toBool();
}
else if (value.isString())
{
qDebug() << key << ":" << value.toString();
}
else if (value.isDouble())
{
qDebug() << key << ":" << value.toVariant().toInt();
}
else if (value.isObject())
{
qDebug() << key << ":";
QJsonObject subObj = value.toObject();
QStringList subKeys = subObj.keys();
for(int k = 0; k < subKeys.size(); ++k)
{
QJsonValue subValue = subObj.value(subKeys.at(k));
if (subValue.isString())
{
qDebug() << " " << subKeys.at(k) << ":" << subValue.toString();
}
else if (subValue.isArray())
{
qDebug() << " " << subKeys.at(k);
QJsonArray array = subValue.toArray();
for (int j = 0; j < array.size(); j++)
{
qDebug() << " " << array[j].toString();
}
}
}
}