最近想学习以下json,由于本人所使用的的框架是wxwidgets,而wxJson已经很多年没有更新了,所以随着版本的变迁这个工具已经在3.0的版本下不易于使用了(我测试的结果式不能使用),所以我转向了现在维护性更好的qt来学习json。
1.什么是json
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
其实就是一种类似于xml的被别人约定好的数据格式。便于存储接解析。
2.怎么书写json文件
{
"int":1,
"bool":true,
"string":"str"
}
这是我认为最简单的json文件书写格式。不同于xml的书写规则,json文件可以直接已{}开头,且他可以直接以数字作为书写元素而不必使用“”;
3.读取xml
void Widget::ReadJson()
{
if (!QFile::exists("2.json"))
{
return;
}
QFile file("2.json");
file.open(QFile::ReadOnly);
if(!file.isOpen())
{
qDebug()<<"open json file error";
return;
}
QByteArray arry = file.readAll();
file.close();
QJsonParseError error;
QJsonDocument doc(QJsonDocument::fromJson(arry,&error));//加载
if(error.error != QJsonParseError::NoError)
{
qDebug()<<"json file load error";
return;
}
QJsonObject jsonObj = doc.object();//转换位对象
if(jsonObj.contains("int"))
{
QJsonValue vale = jsonObj.value("int");
if (vale.isDouble())
{
int a = vale.toInt();
}
}
if (jsonObj.contains("bool"))
{
QJsonValue vale = jsonObj.value("bool");
if (vale.isBool())
{
bool bFlag = vale.toBool();
}
}
if (jsonObj.contains("string"))
{
QJsonValue vale = jsonObj.value("string");
if (vale.isString())
{
QString str = vale.toString();
}
}
}
读取json文件可以直接使用qt所提供的QJsonDocument、 QJsonObject、QJsonValue来完成。
QJsonDocument:
QJsonDocument 类用于读和写 JSON 文档
一个 JSON 文档可以使用 QJsonDocument::fromJson() 从基于文本的表示转化为 QJsonDocument, toJson() 则可以反向转化为文本。解析器非常快且高效,并将 JSON 转换为 Qt 使用的二进制表示。
已解析文档的有效性,可以使用 !isNull() 进行查询。
如果要查询一个 JSON 文档是否包含一个数组或一个对象,使用 isArray() 和 isObject()。包含在文档中的数组或对象可以使用 array() 或 object() 检索,然后读取或操作。
QJsonArray:
QJsonArray 类封装了一个 JSON 数组。
JSON 数组是值的列表。列表可以被操作,通过从数组中插入和删除QJsonValue 。
一个 QJsonArray 可以和一个 QVariantList 相互转换。可以使用 size() 来查询条目的数量,通过 insert() 在指定索引处插入值,removeAt() 来删除指定索引的值。
QJsonObject:
QJsonObject 类封装了一个 JSON 对象。
一个 JSON 对象是一个“key/value 对”列表,key 是独一无二的字符串,value由一个 QJsonValue 表示。
一个 QJsonObject 可以和一个 QVariantMap 相互转换。可以使用 size() 来查询“key/value 对”的数量,通过 insert() 插入“key/value对”, remove() 删除指定的 key。
QJsonValue:
QJsonValue 类封装了一个值。
JSON 中的值有 6 种基本数据类型:
bool(QJsonValue::Bool)
double(QJsonValue::Double)
string(QJsonValue::String)
array(QJsonValue::Array)
object(QJsonValue::Object)
null(QJsonValue::Null)
一个值可以由任何上述数据类型表示。此外,QJsonValue 有一个特殊的标记来表示未定义的值,可以使用isUndefined() 查询。
值的类型可以通过 type() 或 isBool()、isString()等访问函数查询。同样地,值可以通过 toBool()、toString()等函数转化成相应的存储类型。
QJsonParseError:
QJsonParseError 类用于在 JSON 解析中报告错误。
错误我在这篇博客中有看到详情。
如果只是表示一个json对象对使用json来说太过于浅陋,但我查看QJsonValue的时候也发现了isObject()和toObject()函数。所以我们可以写一个多个对象的json文件来测试下
{
"test1": {
"int": 1
},
"test2": {
"bool": true
}
}
读取代码:
if (jsonObj.contains("test1"))
{
QJsonValue vale = jsonObj.value("test1");
QJsonObject obj;
if (vale.isObject())
{
obj = vale.toObject();
}
if (obj.contains("int"))
{
QJsonValue va = obj.value("int");
if (va.isDouble())
{
int a = va.toInt();
}
}
}
4.写xml文件
void Widget::WriteJson()
{
if (QFile::exists("3.json"))
{
return;
}
//构建json对象
QJsonObject obj;
obj.insert("int", 1);
obj.insert("bool", true);
obj.insert("string", "str");
//构建json文档
QJsonDocument doc;
doc.setObject(obj);
QByteArray arry = doc.toJson();
QFile file("3.json");
file.open(QFile::ReadWrite);
if (file.isOpen())
{
file.write(arry);
}
}
如果以后工作中还需要在框架中用到json解析。既然wxJson并没有与版本一起更新,那可以从c++解析json入手找一款解析器。