Json数据解析和生成(C/C++, 使用CJson)
来源:互联网 发布:我的世界ios js 编辑:程序博客网 时间:2024/04/29 09:53
由于工作需要,需要对Json数据进行解析。查阅了很多资料,发现相比于boost和jsoncpp,CJson更加小巧好用,不需要太多的准备工作,只需要把CJson.c和CJson.h导入工程,即可使用。
CJson源代码和示例工程可在此处下载
CJson源码和示例
1 使用CJson解析Json数据
如果要解析以下的Json数据:
{ "programmers": [{ "firstName": "Brett", "lastName": "McLaughlin", "id": 1 }, { "firstName": "Jason", "lastName": "Hunter", "id": 2 }, { "firstName": "Elliotte", "lastName": "Harold", "id": 3 }]}
首先把上述Json数据写入char* jsonStr中,之后,调用
cJSON* root = cJSON_Parse(jsonStr);
得到Json数据指针root
root中存在一个节点,名称为programmers,内容为一个数组,
调用:
cJSON* programmersNode = cJSON_GetObjectItem(root, "programmers");
得到该节点。由于此节点内容为一个数组,可以使用:
int iSize = cJSON_GetArraySize(programmersNode);
取得此数组的元素个数
如果要取出某一个元素,可以使用:
cJSON* firstMan = cJSON_GetArrayItem(programmersNode, 0);
上述代码取得了第一个人的数据,即
{ "firstName": "Brett", "lastName": "McLaughlin", "id": 1}
要取出每一个元素,可以使用:
cJSON* firstName = cJSON_GetObjectItem(programmers[i], "firstName"); cJSON* lastName = cJSON_GetObjectItem(programmers[i], "lastName"); cJSON* id = cJSON_GetObjectItem(programmers[i], "id");
如果要输出每一个元素的值:
cout << "id: " << id->valueint << endl; cout << "FirstName: " << firstName->valuestring << endl; cout << "lastName: " << lastName->valuestring << endl;
解析完毕后,要对空间进行释放:(只需要删除根节点即可)
cJSON_Delete(root);
至此,已经将Json数据基本解析完毕,其余部分类似。解析部分代码如下:
/* 解析Json函数 */BOOL ParseJson(const char* jsonStr){ cJSON* root = cJSON_Parse(jsonStr); BOOL ret = FALSE; if (root != NULL) { cJSON* programmersNode = cJSON_GetObjectItem(root, "programmers"); if (programmersNode != NULL) { int iSize = cJSON_GetArraySize(programmersNode); if (iSize == 3) { cJSON* programmers[3] = {0}; for (int i = 0; i < 3; ++i) { programmers[i] = cJSON_GetArrayItem(programmersNode, i); if (programmers[i] != NULL) { cJSON* firstName = cJSON_GetObjectItem(programmers[i], "firstName"); cJSON* lastName = cJSON_GetObjectItem(programmers[i], "lastName"); cJSON* id = cJSON_GetObjectItem(programmers[i], "id"); if (firstName != NULL && lastName != NULL && id != NULL) { cout << "id: " << id->valueint << endl; cout << "FirstName: " << firstName->valuestring << endl; cout << "lastName: " << lastName->valuestring << endl; } else { cJSON_Delete(root); return FALSE; } } } ret = TRUE; } } } cJSON_Delete(root); return ret;}
2 使用CJson生成Json数据
生成Json数据主要用到如下函数
cJSON_CreateObject //创建一个节点cJSON_CreateArray //创建一个数组cJSON_AddStringToObject //将一个字符串加入一个节点cJSON_AddNumberToObject //将一个整数加入一个节点cJSON_AddItemToArray //将另一个节点加入数组
如果要生成如下的Json串:
{ "programmers": [{ "firstname": "Brett", "lastName": "McLaughlin", "id": 1 }]}
使用的代码如下:
BOOL MakeJson(){ cJSON *temp = cJSON_CreateObject(); if (temp == NULL) { //创建失败 return FALSE; } //加入节点(键值对) cJSON_AddStringToObject(temp, "firstname", "Brett"); cJSON_AddStringToObject(temp, "lastName", "McLaughlin"); cJSON_AddNumberToObject(temp, "id", 1); cJSON * array = cJSON_CreateArray(); if (array == NULL) { //创建失败 return FALSE; } cJSON_AddItemToArray(array, temp); cJSON *root = cJSON_CreateObject(); if (root == NULL) { //创建失败 return FALSE; } cJSON_AddItemToObject(root, "programmers", array); char* strJson = cJSON_Print(root); cout << strJson << endl; free(strJson); cJSON_Delete(root);}
打印Json串的方法:
root是一个cJSON的节点,打印此节点下的所有内容:
char* strJson = cJSON_Print(root);cout << strJson << endl;free(strJson);
0 0
- Json数据解析和生成(C/C++, 使用CJson)
- cJson的用法(一) -C语言解析/生成 json数据
- C/C++下的JSON解析/生成库cJSON
- 使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解
- 使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解
- 使用Cjson在C语言进行Json的创建和解析
- 使用 CJSON 在C语言中进行 JSON 的创建和解析的实例讲解
- CJSON编程使用,组装和解析json格式数据
- 通过使用cJSON使得C语言支持JSON数据
- Lua 使用cjson解析json数据(Mac环境)
- JSON格式解析和libjson使用简介(cJson格式)
- JSON格式解析和libjson使用简介(cJson格式)
- JSON格式介绍和使用cJSON解析
- 使用cJSON库打包json数据及解析json数据
- cJSON库(构建json与解析json字符串)-c语言
- cJSON库(构建json与解析json字符串)-c语言
- cJSON库(构建json与解析json字符串)-c语言
- cJSON库(构建json与解析json字符串)-c语言
- Maven利用tomcat7发布Web
- 【Get深一度】GRE和托福的区别
- hrbust 1594 Gragon Ball【模拟】
- 通过一个简单的例子,说明class文件在运行过程中,import中class怎么被加载并执行的
- C++补第一次实验
- Json数据解析和生成(C/C++, 使用CJson)
- IOS实现Voip应用后台运行需要的几个配置项
- 关于“微信订阅号/制作相册”
- java 线程 thread runnable
- hadoop集群搭建
- C++ - PAT - 1018. 锤子剪刀布 (20)
- 16/6/17
- Binary Tree Level Order Traversal的java实现
- Android学习之消息框