Qt操作Json

1、QJsonDocument

1、详细说明

QJsonDocument类提供了读写JSON文档的方法。

QJsonDocument是一个封装了完整JSON文档的类,可以从基于UTF-8编码的文本或者Qt的二进制格式读写此文档。

可以使用QJsonDocument :: fromJson()将JSON文档从其基于文本的表示转换为QJsonDocument。 toJson()将其转换回文本。 解析器非常快速有效,并将JSON转换为Qt使用的二进制表示。

可以使用!isNull()查询已解析文档的有效性

可以使用isArray()和isObject()查询文档是否包含数组或对象。 可以使用array()或object()检索文档中包含的数组或对象,然后进行读取或操作。

还可以使用fromBinaryData()或fromRawData()从存储的二进制表示创建文档。

2、QJsonArray

1、详细说明

QJsonArray 类封装了一个 JSON 数组。

JSON 数组是值的列表。列表可以被操作,通过从数组中插入和删除 QJsonValue 。

一个 QJsonArray 可以和一个 QVariantList 相互转换。可以使用 size() 来查询条目的数量,通过 insert() 在指定索引处插入值,removeAt() 来删除指定索引的值。支持标准C++的迭代器。

QJsonArray是一个隐式共享类,只要它没有被修改,就会与创建它的文档共享数据。

QJsonArray对象和基于文本的JSON可以通过QJsonDocument进行相互转换。

3、QJsonObject

1、详细说明

QJsonObject 类封装了一个 JSON 对象。

一个 JSON 对象是一个“key/value 对”列表,key 是独一无二的字符串,value 由一个 QJsonValue 表示。

一个 QJsonObject 可以和一个 QVariantMap 相互转换。可以使用 size() 来查询“key/value 对”的数量,通过 insert() 插入“key/value 对”, remove() 删除指定的 key。

QJsonObject是一个隐式共享类,只要它没有被修改,就会与创建它的文档共享数据。

QJsonObject对象和基于文本的JSON可以通过QJsonDocument进行相互转换。

4、QJsonParseError

1、详细说明

QJsonParseError 类用于在 JSON 解析中报告错误。

5、QJsonValue

1、详细说明

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() 等函数转化成相应的存储类型。

与QVariant相反,不会尝试进行任何隐式类型转换。 这意味着转换为未存储在值中的类型将返回默认的构造返回值。

6、实例

生产一下Json文档:

{
"heartData": [
{
"I1": {
"quality": 18.2,
"temp": 25
}
},
{
"I2": {
"quality": 2000,
"temp": 20
}
},
{
"RO Rejection": {
"value": 98
}
},
{
"TOC": {
"value": 3
}
}
]
}

生产代码:

void DJson::clearJsonObject(QJsonObject &object)
{
QStringList strList = object.keys(); for(int i = 0; i < strList.size(); ++i)
{
object.remove(strList.at(i));
} } void DJson::createJsonFile(const QString &fileName)
{
QJsonArray jsonArray;
QJsonObject rootObject;
QJsonObject branchObject;
QJsonObject leafObject; leafObject.insert("quality", 18.2);
leafObject.insert("temp", 25.0);
branchObject.insert("I1", leafObject);
jsonArray.append(branchObject);
clearJsonObject(leafObject);
clearJsonObject(branchObject); leafObject.insert("quality", 2000);
leafObject.insert("temp", 20.0);
branchObject.insert("I2", leafObject);
jsonArray.append(branchObject);
clearJsonObject(leafObject);
clearJsonObject(branchObject); leafObject.insert("value", 98);
branchObject.insert("RO Rejection", leafObject);
jsonArray.append(branchObject);
clearJsonObject(leafObject);
clearJsonObject(branchObject); leafObject.insert("value", 3);
branchObject.insert("TOC", leafObject);
jsonArray.append(branchObject);
clearJsonObject(leafObject);
clearJsonObject(branchObject); rootObject.insert("heartData", jsonArray); QJsonDocument jsonDocument;
jsonDocument.setObject(rootObject); QByteArray byteArray = jsonDocument.toJson(QJsonDocument::Indented); QFile file(fileName);
if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
qDebug() << QString("fail to open the file: %1, %2, %3").arg(__FILE__).arg(__LINE__).arg(__FUNCTION__);
return;
}
QTextStream out(&file);
out << byteArray; file.close(); qDebug() << byteArray;
}

解析:

  void DJson::initList()
{
m_iList << "I1" << "I2" << "I3" << "I4" << "I5";
m_vList << "RO Rejection" << "TOC";
} void DJson::parseJsonFile(const QString &fileName)
{
QFile file(fileName);
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
qDebug() << QString("fail to open the file: %1, %2, %3").arg(__FILE__).arg(__LINE__).arg(__FUNCTION__);
return;
}
QByteArray array = file.readAll();
QJsonParseError jsonParseError;
QJsonDocument jsonDocument(QJsonDocument::fromJson(array, &jsonParseError));
if(QJsonParseError::NoError != jsonParseError.error)
{
qDebug() << QString("JsonParseError: %1").arg(jsonParseError.errorString());
return;
}
QJsonObject rootObject = jsonDocument.object(); if(!rootObject.keys().contains("heartData"))
{
qDebug() << "No target value";
return;
}
qDebug() << rootObject.keys(); QJsonValue jsonValue = rootObject.value("heartData");
if(!jsonValue.isArray())
{
qDebug() << "No target array";
}
QJsonArray jsonArray = jsonValue.toArray(); for(auto iter = jsonArray.constBegin(); iter != jsonArray.constEnd(); ++iter)
{
parseJsonObject(iter);
}
qDebug() << rootObject.keys();
} void DJson::parseJsonObject(QJsonArray::const_iterator iter)
{
QJsonObject jsonObject = (*iter).toObject();
for(int i = 0; i < m_iList.size(); ++i)
{
if(jsonObject.keys().contains(m_iList.at(i)))
{
parseJsonObjectI(jsonObject);
return;
}
} for(int i = 0; i < m_vList.size(); ++i)
{
if(jsonObject.keys().contains(m_vList.at(i)))
{
parseJsonObjectV(jsonObject);
return;
}
} } void DJson::parseJsonObjectI(QJsonObject &object)
{
qDebug() << object.keys();
for(int i = 0; i < object.keys().size(); ++i)
{
QJsonValue jsonValue = object.value(object.keys().at(i));
if(jsonValue.isObject())
{
QJsonObject jsonObject = jsonValue.toObject(); if(jsonObject.keys().contains("quality"))
{
qDebug() << QString("%1 : %2").arg("quality").arg(jsonObject.value("quality").toDouble());
}
if(jsonObject.keys().contains("temp"))
{
qDebug() << QString("%1 : %2").arg("temp").arg(jsonObject.value("temp").toDouble());
}
}
}
qDebug() << object.keys();
} void DJson::parseJsonObjectV(QJsonObject &object)
{
qDebug() << object.keys();
for(int i = 0; i < object.keys().size(); ++i)
{
QJsonValue jsonValue = object.value(object.keys().at(i));
if(jsonValue.isObject())
{
QJsonObject jsonObject = jsonValue.toObject();
if(jsonObject.keys().contains("value"))
{
qDebug() << QString("%1 : %2").arg("value").arg(jsonObject.value("value").toInt());
}
}
}
qDebug() << object.keys();
}

Qt操作Json小结的更多相关文章

  1. Qt读写Json

    Qt操作Json 1.QJsonDocument 1.详细说明 QJsonDocument类提供了读写JSON文档的方法. QJsonDocument是一个封装了完整JSON文档的类,可以从基于UTF ...

  2. C#操作JSON

    http://www.cnblogs.com/LiZhiW/p/3624729.html C#操作JSON 1. .NET对JSON的支持介绍............................. ...

  3. C#操作Json(转)

    原文:http://wenku.baidu.com/link?url=3dlqKdF26ZdQIAcX9jvP2ZYEtl3J0sKOV8XuHQI0Rz4SjB9S46nqmGiMXUVQa_1Pm ...

  4. QJsonDocument实现Qt下JSON文档读写

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QJsonDocument实现Qt下JSON文档读写     本文地址:http://tech ...

  5. 让C#可以像Javascript一样操作Json

    Json的简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了 ...

  6. JavaScript操作JSON的方法总结,JSON字符串转换为JSON对象

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...

  7. C# 技巧(3) C# 操作 JSON

    RestAPI中, 经常需要操作json字符串,  需要把json字符串"反序列化"成一个对象, 也需要把一个对象"序列化"成一字符串. C# 操作json, ...

  8. JS操作JSON总结

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...

  9. jsoncpp操作 json

    jsoncpp操作 json 博客分类: c/c++ object-c 之 iphone   #include <iostream> //#include "json/json. ...

随机推荐

  1. Opengl ES之FBO

    FBO介绍 FBO帧缓冲对象,它的主要作用一般就是用作离屏渲染,例如做Camera相机图像采集进行后期处理时就可能会用到FBO.假如相机出图的是OES纹理,为了方便后期处理, 一般先将OES纹理通过F ...

  2. LeetCode - 二维数组及滚动数组

    1. 二维数组及滚动数组总结 在二维数组num[i][j]中,每个元素都是一个数组.有时候,二维数组中的某些元素在整个运算过程中都需要用到:但是有的时候我们只需要用到前一个或者两个数组,此时我们便可以 ...

  3. P3008 [USACO11JAN]Roads and Planes G (最短路+拓扑排序)

    该最短路可不同于平时简单的最短路模板. 这道题一看就知道用SPFA,但是众所周知,USACO要卡spfa,所以要用更快的算法. 单向边不构成环,双向边都是非负的,所以可以将图分成若干个连通块(内部只有 ...

  4. OnionArch - 如何实现更新指定字段的通用Handler

    博主最近失业在家,找工作之余,自己动手写了个洋葱架构(整洁架构)解决方案,以总结和整理以前的项目经验,起名叫OnionArch,其目的是为了更好的实现采用DDD(领域驱动分析)和命令查询职责分离(CQ ...

  5. Linux基础_3_文件/文件夹权限管理

    注:权限遮罩码: 控制用户创建文件和文件夹的默认安全设置,文件默认权限为666-umask的值,文件夹默认权限为777-umask的值. root默认0022,普通用户默认0002. 文件的默认权限不 ...

  6. 用 VS Code 搞 Qt6:信号、槽,以及QObject

    Qt 里面的信号(Signal)和槽(Slot)虽然看着像事件,但它实际上是用来在两个对象之间进行通信的.既然是通信,就会有发送者和接收者. 1.信号是发送者,触发时通过特有的关键字"emi ...

  7. 题解 P4058 [Code+#1]木材

    前言 这什么题啊,不就是个二分答案我从65到100都经历了一遍--(瞬间气哭) \(\sf {Solution}\) 题目理解起来不难的,大意就懒得写了. 一眼二分答案. 此题属于在形如 \(\{0, ...

  8. 题解 SP24 FCTRL2 - Small factorials

    双倍经验. 题意 给\(t\) 组数据,求每组数据中\(n\) 的阶乘. 思路 \(n≤100\) . \(100!\) 肯定爆int128,所以高精呗. 那么就是一个阶乘的板子了,应该不难的吧. 具 ...

  9. ubuntu 输入法IBUS 输入不成功问题

    ubuntu 输入法IBUS 输入不成功问题 只需要在 输入如下代码 -Xms128m -Xmx750m -XX:ReservedCodeCacheSize=240m -XX:+UseConcMark ...

  10. JS常见问题总结

    1. 什么是 JavaScript ? JavaScript 是一种具有面向对象的.解释型的.基于对象和事件驱动的.跨平台的.弱类型的程序设计语言 2. JavaScript 与 ECMAScript ...