赞
踩
一.前言:
JSON是一种轻量级数据交换格式,常用于客户端和服务端的数据交互,不依赖于编程语言,在很多编程语言中都可以使用JSON,比如C,C++,Java,Android,Qt。除了JSON,还有一种数据传输格式XML,相较于XML,JSON更加便于阅读和书写。
JSON 有两种数据格式:JSON对象和JSON数组。被中括号包裹的是JSON数组,被大括号包裹的是JSON对象。
二.JSON数组:
JSON数组的格式:[元素1,元素2,元素3,…]
示例1:元素可以是不同数据类型
[1,2,3.14,"hello world",true,null]
示例2:元素可以是JSON对象或JSON数组
[
{
"id":123,
"name":"tom"
},
[1,2,3.14,"hello world",true,null]
]
三.JSON对象:
JSON对象的格式:一个或多个键值对组成
示例1:
{
"id":123,
"name":"tom"
}
示例2:嵌套JSON对象和JSON数组,JSON对象和JSON数组也要使用键值对格式
{ "name": "John Doe", "age": 30, "address": { "city": "New York", "street": "123 Main St" }, "phoneNumbers": [ { "type": "home", "number": "555-1234" }, { "type": "work", "number": "555-5678" } ], "hobbies": ["reading", "painting", "playing guitar"], "isStudent": true }
小结:JSON数组里可以包含JSON对象或JSON数组,JSON对象里也可以嵌套JSON对象或JSON数组。
四.Qt中JSON的使用:1.生成JSON数据、2.解析JSON数据
在QT5.0版本以后支持对JSON的使用,QT5.0之前需要自己集成第三方库。
1.生成JSON数据
要生成的JSON数据如下:
{ "name": "小王", "age": 30, "address": { "city": "北京", "street": "人民路32号" }, "phoneNumbers": [ { "number": "999-123456", "type": "家" }, { "number": "999-654321", "type": "公司" } ] }
使用Qt生成上面的JSON数据:
#include <QJsonObject> #include <QJsonArray> #include <QJsonDocument> #include <QDebug> void MainWindow::writeJSON() { // 创建最外层的 JSON 对象,里面包含要构建的所有 JSON 数据 QJsonObject rootObj; // 插入 name 键值对到 rootObj rootObj.insert("name","小王"); // 插入 age 键值对到 rootObj rootObj.insert("age",30); // 创建地址 JSON 对象,里面包含两个键值对 QJsonObject addressObj; addressObj.insert("city","北京"); addressObj.insert("street","人民路32号"); // 插入地址 JSON 对象到 rootObj rootObj.insert("address",addressObj); // 创建电话 JSON 数组,里面包含两个电话 JSON 对象 QJsonArray phoneArray; // 创建两个电话 JSON 对象 QJsonObject phoneHomeObj; phoneHomeObj.insert("type","家"); phoneHomeObj.insert("number","999-123456"); QJsonObject phoneWorkObj; phoneWorkObj.insert("type","公司"); phoneWorkObj.insert("number","999-654321"); // 在电话 JSON 数组中添加两个电话 JSON 对象 phoneArray.append(phoneHomeObj); phoneArray.append(phoneWorkObj); // 插入电话 JSON 数组到 rootObj rootObj.insert("phoneNumbers",phoneArray); // 将 rootObj JSON对象转换为 JSON 数据格式 QJsonDocument doc(rootObj); QByteArray json = doc.toJson(); // 打印 qDebug()<<QString::fromUtf8(json); }
2.解析JSON数据
要解析的JSON数据如下,先将它放在test.json文本文件中:
{ "name": "小王", "age": 30, "address": { "city": "北京", "street": "人民路32号" }, "phoneNumbers": [ { "number": "999-123456", "type": "家" }, { "number": "999-654321", "type": "公司" } ] }
使用Qt解析上面的JSON数据:
#include <QJsonObject> #include <QJsonArray> #include <QJsonDocument> #include <QDebug> #include <QFile> void MainWindow::analyseJSON() { // 读取文本中的 JSON 数据 QFile file("C:\\Users\\A\\Desktop\\temp\\test.json"); file.open(QFile::ReadOnly); QByteArray json = file.readAll(); file.close(); // 将 JSON 数据转换为 QJsonDocument 对象 QJsonDocument doc = QJsonDocument::fromJson(json); if(!doc.isObject()) {// 不是 JSON 对象:JSON 字符串格式错误或无效 qDebug()<<"不是 JSON 对象:JSON 字符串格式错误或无效"; return; } // 将 QJsonDocument 对象中的 JSON 数据转换为 JSON 对象 QJsonObject obj = doc.object(); // 获取 JSON 数据中的所有键 QStringList keys = obj.keys(); // 遍历键值对 for (int i = 0;i<keys.size();++i) { // 获取每一个 key QString key = keys[i]; // 通过 key 获取对应的 value QJsonValue value = obj.value(key); if(value.isBool()) {// 值是一个 bool qDebug()<<key<<":"<<value.toBool(); } else if(value.isString()) {// 值是一个字符串 qDebug()<<key<<":"<<value.toString(); } else if(value.isDouble()) {// 值是一个 double 或者 int(double 和 int 都用 isDouble) qDebug()<<key<<":"<<value.toInt(); } else if(value.isObject()) {// 值是一个 JSON 对象 qDebug()<<key<<":"; // 这里偷个懒,不再像上面那样循环获取值了,而是直接通过已知的键去获取值 QJsonObject addressObj = value.toObject(); QString city = addressObj["city"].toString(); QString street = addressObj["street"].toString(); qDebug()<<" "<<"city:"<<city; qDebug()<<" "<<"street:"<<street; } else if (value.isArray()) {// 值是一个 JSON 数组 qDebug()<<key<<":"; QJsonArray phoneArray = value.toArray(); for (int i = 0;i<phoneArray.size();++i) {// 遍历 JSON 数组中的每一个 JSON 对象 QJsonObject phoneObj = phoneArray[i].toObject(); QString number = phoneObj["number"].toString(); QString type = phoneObj["type"].toString(); qDebug()<<" "<<"number:"<<number; qDebug()<<" "<<"type:"<<type; } } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。