Qt json

为了避免重造所有的轮子,我google了一下Qt上已经实现的JSON解析器。gitorious上有个qjson,但是据说过于庞大;Qt5已经在QtCore中支持JSON解析了,不过我目前没有时间研究如何挖出这部分代码(顺便吐槽一下Qt5,好像分布在多个地方,要很麻烦的才能clone下来)。另外有人在stackoverflow上建议一个轻量级的JSON解析器,其实就是一个类, qt-json 。看起来好像不错,比较适合我这个mini的工程,先add submodule了,用时再研究一下。

qt-json用法的页面: http://ereilin.tumblr.com/post/6857765046/lightweight-json-parser-serializer-class-for-qt

用Qt自带的QScript解析的方法:http://qtwiki.org/Parsing_JSON_with_QT_using_standard_QT_library


以前一直使用QJson,一直不更新,编译起来也很麻烦

<think>我们正在处理关于Qt框架中JSON数据处理的问题。根据提供的引用,我们将逐步解释如何在Qt中解析、创建、修改以及保存和读取JSON数据。引用[1]提到Qt中处理JSON数据,包括解析、创建、修改、保存和读取。引用[2]给出了一个具体的示例,展示如何创建JSON对象、数组,生成JSON文档,以及解析JSON文档并获取其中的值。引用[3]展示了如何从文件读取JSON数据并解析(反序列化)。引用[4]展示了一个JSON数据的例子。因此,我们将按照以下步骤进行:1.解析JSON数据(反序列化)2.创建和修改JSON数据3.将JSON数据保存到文件和从文件读取注意:Qt中处理JSON的主要类有:-QJsonDocument:表示一个JSON文档,可以从字符串或文件解析,也可以将JSON对象/数组转换为字符串或字节数组。-QJsonObject:表示一个JSON对象(键值对集合)。-QJsonArray:表示一个JSON数组(值的有序列表)。-QJsonValue:表示JSON中的值,可以是基本类型(字符串、数字、布尔值、null)或对象、数组。-QJsonParseError:用于报告解析过程中的错误。步骤1:解析JSON数据(反序列化)我们可以从字符串或文件中解析JSON数据。示例1:从字符串解析QStringjsonString="{\"name\":\"Jack\",\"age\":20,\"hobbies\":[\"reading\",\"coding\"]}";QJsonParseErrorerror;QJsonDocumentjsonDoc=QJsonDocument::fromJson(jsonString.toUtf8(),&error);if(error.error!=QJsonParseError::NoError){qDebug()<<"解析错误:"<<error.errorString();}else{QJsonObjectjsonObj=jsonDoc.object();//然后可以获取值}示例2:从文件解析(如引用[3]所示)QFilefile("data.json");if(!file.open(QIODevice::ReadOnly)){qDebug()<<"打开文件失败";return;}QByteArrayjsonData=file.readAll();file.close();QJsonParseErrorerror;QJsonDocumentjsonDoc=QJsonDocument::fromJson(jsonData,&error);if(error.error!=QJsonParseError::NoError){qDebug()<<"解析错误:"<<error.errorString();}else{//处理jsonDoc}步骤2:创建和修改JSON数据创建JSON对象和数组,然后将其组合成文档。示例(如引用[2]所示)://创建JSON对象QJsonObjectobj;obj.insert("name","Jack");obj.insert("age",20);//创建JSON数组QJsonArrayhobbies;hobbies.append("reading");hobbies.append("coding");obj.insert("hobbies",hobbies);//创建JSON文档QJsonDocumentdoc(obj);//将文档转换为字符串(可以设置格式化选项,如缩进)QStringjsonStr=doc.toJson(QJsonDocument::Indented);修改JSON数据:可以先获取对象或数组,然后进行修改。QJsonObjectjsonObj=doc.object();jsonObj["age"]=21;//修改age字段jsonObj.remove("hobbies");//删除hobbies字段//或者添加新字段jsonObj.insert("country","China");//修改数组QJsonArraynewHobbies;newHobbies.append("swimming");jsonObj.insert("hobbies",newHobbies);//重新插入hobbies数组步骤3:保存JSON数据到文件将QJsonDocument转换为QByteArray,然后写入文件。示例:QFilesaveFile("output.json");if(!saveFile.open(QIODevice::WriteOnly)){qDebug()<<"无法打开文件进行写入";return;}//获取当前文档的JSON表示QByteArrayjsonData=doc.toJson(QJsonDocument::Indented);saveFile.write(jsonData);saveFile.close();综合以上步骤,我们可以在Qt中完成JSON数据的处理。注意:在操作JSON时,要注意类型转换。例如,从QJsonObject中获取值时,使用toString(),toInt(),toArray(),toObject()等方法。下面是一个完整的示例,包括创建JSON对象、保存到文件、从文件读取并解析:</think>### Qt框架中JSON数据处理指南 在Qt中处理JSON数据主要使用`QJsonDocument`、`QJsonObject`、`QJsonArray`和`QJsonValue`等类。以下是核心操作步骤: #### 1. **JSON数据解析(反序列化)** ```cpp // 从字符串解析JSON QString jsonStr = R"({"name":"Jack", "age":20, "hobbies":["reading","coding"]})"; QJsonParseError error; QJsonDocument doc = QJsonDocument::fromJson(jsonStr.toUtf8(), &error); if (error.error != QJsonParseError::NoError) { qDebug() << "JSON解析错误:" << error.errorString(); return; } // 提取数据 QJsonObject obj = doc.object(); qDebug() << "name:" << obj["name"].toString(); // 输出: "Jack" qDebug() << "age:" << obj["age"].toInt(); // 输出: 20 QJsonArray hobbies = obj["hobbies"].toArray(); for (auto hobby : hobbies) { qDebug() << "hobby:" << hobby.toString(); } ``` > 当解析失败时,`QJsonParseError`会提供具体错误信息[^3]。 #### 2. **创建JSON数据(序列化)** ```cpp // 创建JSON对象 QJsonObject employee; employee.insert("name", "Alice"); employee.insert("age", 28); // 创建嵌套数组 QJsonArray projects; projects.append("Qt Framework"); projects.append("JSON Parser"); employee.insert("projects", projects); // 生成格式化JSON字符串 QJsonDocument newDoc(employee); QString output = newDoc.toJson(QJsonDocument::Indented); /* 输出: { "name": "Alice", "age": 28, "projects": [ "Qt Framework", "JSON Parser" ] } */ ``` #### 3. **文件读写操作** ```cpp // 写入JSON文件 QFile saveFile("data.json"); if (saveFile.open(QIODevice::WriteOnly)) { saveFile.write(output.toUtf8()); saveFile.close(); } // 读取JSON文件 QFile loadFile("data.json"); if (loadFile.open(QIODevice::ReadOnly)) { QJsonDocument fileDoc = QJsonDocument::fromJson(loadFile.readAll()); QJsonObject root = fileDoc.object(); // 处理数据... } ``` > 文件操作需配合`QFile`类,注意检查文件打开状态[^3]。 #### 4. **修改JSON数据** ```cpp // 修改现有值 employee["age"] = 29; // 更新年龄 // 添加新字段 employee.insert("department", "R&D"); // 删除字段 employee.remove("projects"); ``` ### 关键注意事项 1. **类型转换**:使用`toString()`, `toInt()`, `toDouble()`, `toArray()`等方法进行安全类型转换 2. **错误处理**:始终检查`QJsonParseError`和`QJsonValue`转换的有效性 3. **内存管理**:JSON对象在Qt中自动管理内存,无需手动释放 4. **编码规范**:JSON字符串必须使用UTF-8编码[^2] 对于复杂JSON结构(如引用[4]的嵌套数据),可通过递归访问对象和数组实现深度解析: ```cpp QJsonObject result = root["result"].toObject(); qDebug() << "City:" << result["City"].toString(); // 输出"太原市" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值