cJSON的读写与个人理解
2020-07-29 11:32
65 查看
写cJSON
[code]/* ## 输出到文件流 即从内存到硬盘 @fileName 文件路径 @ std::ios::out | std::ios::trunc 打开文件的方式 @ 这些标识符可以被组合使用,中间以”或”操作符(|)间隔。 */ std::ofstream ofs(fileName.toLocal8Bit().constData(), std::ios::out | std::ios::trunc); if (!ofs.good()) return; /* @ jsonObj 这个cJSON一定要完全同名,原因是cJSON的宏要直接引用它,具体可以查看头文件的宏定义 */ std::shared_ptr<cJSON> idx(cJSON_CreateObject(), cJSON_Delete); cJSON* jsonObj = idx.get(); /* @ v 变量名 最后保存到cJSON时将成为 字段名即key @ 实际上cJson的数据存储方式可以理解为多层次()嵌套的键值对的集合 <key,value(<key,value>,<key,value>)> */ //double型 int string bool同理 double *v=0.01; JSON_DOUBL_SET(v); //double 数组 其他同理 double *array = array ; JSON_DOUBLEARRAY_SET(array, n); /* ## 字符串列表 其他类型的List同理 ## 只需将cJSON_CreateString 换成同作用的函数 @ yourList 为QStringList */ cJSON *List = cJSON_CreateArray(); for (const QString str : yourList) { QByteArray strArr = str.toLocal8Bit(); cJSON_AddItemToArray(List, cJSON_CreateString(std::string(strArr.constData(), strArr.length()).c_str())); } cJSON_AddItemToObject(jsonObj, "List", List); //完成cJSON对象后,将jsonObj的内容转换成char*,输出到文件 char* idx_txt = cJSON_Print(jsonObj); ofs << idx_txt; ofs.close(); free(idx_txt);
读cJSON
[code]/* @idx_input 暂存cJSON文件的内容,即从硬盘到内存 @len cJSON文件的内容的大小 @至于为什么要 多存一个 '\0',我理解为cJSON的结束符(未经证实,纯属猜测) */ std::vector<char> idx_input; qint64 len = QFileInfo(fileName).size(); idx_input.resize(len + 1); std::ifstream ifs(fileName.toLocal8Bit().constData(), std::ios::in); if (!ifs.good()) return; ifs.read(&(idx_input.front()), len); idx_input.back() = '\0'; ifs.close(); std::shared_ptr<cJSON> idx(cJSON_Parse(&(idx_input.front())), cJSON_Delete); cJSON* jsonObj = idx.get(); if (!jsonObj) return; //读key为v的vlue int bool double string同理 cJSON* v = cJSON_GetObjectItem(jsonObj, "v"); if (v) yourV = v->valueint); else return false; //也可以 int v=0; JSON_INT_GET(v); /* ## 数组 list 读取方式类似 @ List 从父对象jsonObj里找到key为"List"的键值对的地址赋值给List @ tmp的父对象为List,从父对象List里找到第i个键值对的地址赋值给tmp @ tmp->valuestring 取tmp的value */ cJSON* List = cJSON_GetObjectItem(jsonObj, "List"); if (List) { for (int i = 0; i < cJSON_GetArraySize(List); i++) { cJSON *tmp = cJSON_GetArrayItem(List, i); yourList.append(QString::fromLocal8Bit(tmp->valuestring)); } } else return;
更复杂的数据结构请参考
相关文章推荐
- [WPF]C#读写ini配置文件【个人学习用】
- 个人对JavaScript闭包的一些理解
- node学习篇——mongodb个人理解
- 【KMP】kmp学习(个人知识点理解顺序)
- 记录个人对translate()的一点理解
- Java NIO 的简单读写 以及理解
- Java NIO 的简单读写 以及理解
- Java泛型的个人理解
- 学校内网查询到的外网IP,不能做服务器的个人理解
- hbase LSM树个人理解
- 汉诺塔问题(以及递归的个人理解)
- BI基本架构和ETL的个人理解
- 蓝牙BLE和SPP的个人简单了解理解(基于KT1025A开发学习了3天)
- Openstack个人理解及各部分解释(一)
- java中静态信息,成员信息的个人理解,构造器与重载
- 蓝鲸python第二题个人理解版
- 个人理解session、application、cookie等状态管理的含义
- c++环状单链表简单理解(个人见解)
- 思科单臂路由实验个人的理解
- awk合并文件的个人理解