1.json文件注意事项
2.json操作4个类
1.json 注意事项:
1.1.最后一个不加",".
1.2.key值唯一
1.3.同一个文件只能有一个json对象或者是json数组,根节点只能有一个。
1.3.1json对象
1.3.2json数组
2.json操作4个类
函数参看帮助。
2.1.json 对象,jsonobject:key值升序排列,红黑树。
#1.创建
QJsonObject::QJsonObject() //构造空对象
#2,键值对添加到json
iterator QJsonObject::insert(const QString &key, const QJsonValue &value);//key value
#3. 获取对象中键值对的个数
int QJsonObject::count() const;
int QJsonObject::size() const;
int QJsonObject::length() const;
#4.通过Key去除value
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;
#5.删除
void QJsonObject::remove(const QString &key);
QJsonValue QJsonObject::take(const QString &key); //删除键值对后,返回value值
#6.通过Key查找
iterator QJsonObject::find(const QString &key); //返回的是迭代器,解引用,可以得到数据
bool QJsonObject::contains(const QString &key) const; //查看QJsonObject对象中,是否 存在这个key键值对
#7.遍历
1.使用迭代器函数
2.使用[],遍历,类似遍历数组,[]中是key
3.先得到对象中所有的键值,在遍历键值列表,通过key得到value
QStringList QJsonObject::keys() const;//得到当前Json对象中所有的key值
2.2 json数组 ,jsonarray 添加顺序就是它的数组顺序。
#1.创建
QJsonArray::QJsonArray()
#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); //添加到头部
#3.计算个数
int QJsonArray::count() const;
int QJsonArray::size() const;
#4.取某个元素
QJsonValue QJsonArray::at(int i) const; //参数i:为在数组中元素对应的下标 拷贝,不能修改数组内元素的值
QJsonValue QJsonArray::first() const; //头部元素 拷贝
QJsonValue QJsonArray::last() const; //尾部元素 拷贝
QJsonValueRef QJsonArray::operator[](int i);//这里返回的值是引用,可以修改 数组内的值
#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.遍历
.cpp
#include "myjson.h"
MyJson::MyJson(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
QJsonDocument doc;
if (doc.isEmpty())
{
qDebug() << "Json document is emputy!";
}
if (doc.isNull())
{
qDebug() << "Json document is null!";
}
writeJson();
readJson();
}
MyJson::~MyJson()
{
}
/*
//1.难点在于解析几层
2.注意事项:
2.1json元素最后一个不加逗号
2.2key必须是唯一的
2.3文件里只允许有一个大的结构 只能有一个根节点
//1.基本
{"firstName":"John","lastName":"Doe"}
//2.一个Key,value是列表list 多个,最后一个没有“,”
{"employees":[
{},
{},
{}
]}
{"employees":[
{"firstName":"John","lastName":"Doe"},
{"firstName":"Anna","lastName":"Smith"},
{"firstName":"Peter","lastName":"Jones"}
]}
employees[0].lastName="Jobs";
//3.数组里是json对象
[
{}
]
[
{
"luffy":{
"age":19,
"father":"f1",
"borther":"b1",
"mother":"m1"
}
}
]
//4.描述一个人。一个json对象 多个key value是json对象
{
"Name": "Ace",
"Sex":"man",
"Age":20,
"Family":{
"Father": "F1",
"Mother": "M1",
"Brother":["B1","B2"]
},
"IsAlive":false,
"address": "yyds"
}
*/
writejson()
/*write
QJsonObject obj;
QJsonArray familyarr;
.append()
.insert()
*/
void MainWindow::writeJson()
{
QJsonObject rootobj;
rootobj.insert("Name","Ace");//此处是QjsonValue类型,非字符串
rootobj.insert("Sex","man");
rootobj.insert("Age",20);
QJsonObject subobj;
subobj.insert("Father","F1");
subobj.insert("Mother","M1");
QJsonArray arr;
arr.append("B1");
arr.append("B2");
subobj.insert("Brother",arr);
rootobj.insert("Family",subobj);
QJsonDocument doc(rootobj); //json序列化
QByteArray json=doc.toJson(); //转换成文本
//写入磁盘
QFile file("D:\\QTPrj\\HTTP_JSON\\temp.json");
file.open(QIODevice::WriteOnly);
file.write(json);
file.close();
}
readfromfile()
/*read
QJsonArray count();size();
QJsonVaule at(i); //得到的是这个位置的拷贝
frist();
last();
QJsonVauleRef operator[](int i) 引用
删除:
iterator QJsonArray::erase(iterator it)
QJsonArray pop_back();
pop_front();
removeAt();
removeFrist();
removeLast();
QJsonVaule takeAt(int i); 删除
*/
/*
QJsonDocument fromBinaryData()
fromJson()
isArray() //判断对象 返回 QJsonObject
isObject()//判断数组
*/
void MyJson::readJson()
{
//读取文件
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();
}
}
}
}
}
}
}
.h
#ifndef MYJSON_H
#define MYJSON_H
#include <QtWidgets/QWidget>
#include "ui_myjson.h"
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include <QJsonValue>
#include <QDebug>
#include <QString>
#include <QByteArray>
#include <QFile>
class MyJson : public QWidget
{
Q_OBJECT
public:
MyJson(QWidget *parent = 0);
void writeJson();
void readJson();
~MyJson();
private:
Ui::MyJsonClass ui;
};
#endif // MYJSON_H