JSON

【笔记】教你快速搞定Qt下的Json文件使用

字号+ 作者:H5之家 来源:H5之家 2017-02-08 18:00 我要评论( )

【笔记】教你快速搞定Qt下的Json文件使用

教你快速搞定Qt下的Json文件使用

JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。JSON 解析器和 JSON 库支持许多不同的编程语言,目前非常多的编程语言都支持JSON。接下来传智播客C/C++培训专家为大家介绍一下Qt下的Json的使用。

Json的两种结构

JSON有两种表示结构,对象和数组。

l  对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,语法结构如代码。

       {

         key1:value1,

         key2:value2,

         ...

}

其中关键字是字符串,而值可以是字符串,数值,true,false,null,对象或数组。

l  数组结构以”[”开始,”]”结束。中间由0或多个以”,”分隔的值列表组成,语法结构如代码。

[

true,

123,

“hello,world”

       数组中的元素值类型可以相同也可不同。

Json格式的文件在使用的时候是十分灵活的,其中数组和对象之间也是可以相互嵌套的,大家可以按照自己的实际需求来定义成对应的格式。例如:

       [

{ "firstName":"John" ,"lastName":"Doe" },

{ "firstName":"Anna" ,"lastName":"Smith" },

{ "firstName":"Peter" , "lastName":"Jones" }

Qt5中JSON的生成与解析

Qt5 新增加了处理 JSON 的类,与 XML 类库类似,均以 QJson 开头,在 QtCore 模块中,不需要额外引入其它模块。Qt5 新增加六个相关类:

      

类说明

QJsonDocument

读写 JSON 文档

QJsonObject

封装 JSON 对象

QJsonArray

封装 JSON 数组

QJsonValue

封装JSON 值

QJsonObject::iterator

用于遍历 QJsonObject 的 STL 风格的非 const 遍历器

QJsonParseError

报告 JSON 处理过程中出现的错误

需要大家着重掌握的类为前四个。

QJsonDocument

该Json文档类主要是把json格式的数据解析为Qt中的Json文档对象,所有我们在使用该类之前,需要先把数据准备好:

] 解析Json

1.   使用QFile对象加载指定的Json格式文件

a)    QFile file(”D:\\myjson.json”);

b)    file.open(QIODevice::ReadWrite);

2.   通过QFile类中的read方法将文件数据读到内存

a)    QByteArray json = file. readAll();

3.   QJsonDocument::fromJson() 可以由 QByteArray 对象构造一QJsonDocument 对象,用于我们的读写操作

a)    QJsonDocument jsDoc;

b)    jsDoc = QJsonDocument::fromJson(json.toUtf8());

QJsonObject

]  生成json对象

因为json对象为键值对,所以我们可以使用QJsonObject类的insert方法,向该类对象中插入数据。

1.   创建空的QJsonObject对象

a)    QJsonObject obj;

2.   使用insert方法向空对象中插入数据

a)    obj.insert(“name”, “Jack”);

b)    obj.insert(“age”, 26);

c)     obj.insert(“isboy”, true);

]  解析json对象

1.   首先需要先得到一个QJsonDocument对象,然后判断该对象是否是一个json对象,使用isObject()方法

2.   使用QJsonDocument类的object()方法可以将json文档对象转换为Json对象。

3.   可以通过QJsonObject对象的key值得到其value值,访问方式为QJsonValue value = obj[key]

4.   使用QJsonValue类的成员方法将value值转换为实际的数据类型。

QJsonDocumentparse_doucment;

parse_doucment =QJsonDocument::fromJson(byte_array);

if(parse_doucment.isObject())  

{  

QJsonObject obj = parse_doucment.object();

    if(obj.contains("name"))  

    {  

                 QJsonValuename_value = obj["name"];

                 if(name_value.isString())

                 {

                  QStringname = name_value.toString();

                 }

}

QJsonArray

]  生成Json

1.   创建Json数组:

a)    QJsonArray json;

2.   使用QJsonArray类的insert方法插入数据:

a)    json.insert(0,QString("Qt"));

b)    json.insert(1,QString("version"));

c)     json.insert(2, true);

3.   创建Json文档对象:

a)    QJsonDocument document;

4.   将初始化完成的json数组对象设置给Json文档对象

a)    document.setArray(json);

5.   将json文档对象转换为QByteArray对象

a)    QByteArray byte_array =document.toJson();

生成的文件格式:["Qt","version",true]

]  解析Json

1.   首先需要先得到一个QJsonDocument对象,然后判断该对象是否是一个json数组,使用isArray()方法。

2.   使用QJsonDocument类的array()方法可以将json文档对象转换为Json对象。

3.   可以通过QJsonArray对象遍历得到其中的每个value值,访问方式与遍历普通数组的方式相同。

4.   使用QJsonValue类的成员方法将value值转换为实际的数据类型。

QJsonDocumentparse_doucment;

parse_doucment =QJsonDocument::fromJson(byte_array);

if(parse_doucment.isArray())  

{  

QJsonArray array = parse_doucment.array();

int size = array.size();

for(int i=0; i<size; ++i)

   {

         QJsonValuevalue = array.at(i);

         if(value.isString())

         {

QString name = value.toString();

         }

         elseif(value.isBool())

         {

bool flag = value.toBool();

         }

}

}

QJsonValue

在使用json对象或json数组对象得到对应的value之后,该value值并不是最终的数据类型而是一个QJsonValue类型的属性,我们必须通过该对象判断该类型的实际类型,然后在将其转换为对应的数据类型:

]  类型判断相关的成员方法:

n  bool isArray() const      // 是否为json数组

n  bool isBool() const        // 是否为布尔类型

n  bool isDouble() const          //是否为浮点类型

n  bool isNull() const                //是否为空

n  bool isObject() const           //是否为json对象

n  bool isString() const             //是否为字符串类型

]  数据类型转换相关成员方法:

n  QJsonArray  toArray(constQJsonArray &defaultValue) const

n  QJsonArray  toArray() const         //转为为json数组

n  bool  toBool(bool defaultValue= false) const      // to布尔类型

n  double  toDouble(doubledefaultValue = 0) const

n  int  toInt(int defaultValue =0) const

n  QJsonObject  toObject(constQJsonObject &defaultValue) const

n  QJsonObject  toObject() const    // 转换为json对象

n  QString  toString(const QString&defaultValue = QString()) const

生成Json

1.   创建JsonObject对象或数组(再次以对象举例)

a)    QJsonObject json;

2.   往json对象中添加键值对

a)    json.insert("name",QString("Qt"));

b)    json.insert("version",5);

c)     json.insert("windows",true);

3.   创建Json文档对象

a)    QJsonDocument document;

4.   将Json对象或数组设置给json文档对象

a)    document.setObject(json); // 数组:setArray(array)

5.   将文档对象转换为QByteArray类型的数据

a)    QByteArray byte_array =document.toJson();

6.   将该数据通过QFile对象保存为磁盘文件。

最终格式:{"name":"Qt","version": 5,"windows": true}

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
网友点评