丁香园做科室网站,大学生做网站的流程,做网站要备案,博客式笑话网站织梦源码如何高效使用和处理JSON格式的数据 问题引入关于CJSON示例代码头文件引用处理数据 问题引入
最近的项目在用c处理后台的数据时#xff0c;因为好多外部接口都在使用Json格式作为返回的数据结构和数据描述#xff0c;如何在c中高效使用和处理Json格式的数据就成为了必须要解决… 如何高效使用和处理JSON格式的数据 问题引入关于CJSON示例代码头文件引用处理数据 问题引入
最近的项目在用c处理后台的数据时因为好多外部接口都在使用Json格式作为返回的数据结构和数据描述如何在c中高效使用和处理Json格式的数据就成为了必须要解决的问题。
关于CJSON
经常使用Java开发的同学可能觉得这个不是个问题fastjson对于Json格式的数据处理提供了很好的支持。顺着这个思路往下走后在Json的官网上发现推荐了好几个c的功能库。根据个人使用的情况综合易于上手和对Json数据操作的便捷性来说推荐cJSON: cJSON on Github
示例代码
头文件引用
cJson可以直接在使用的地方引用如下面这样。
#include ../include/cJSON.h
#include ../include/cJSON_Utils.h也可能编译成so文件作为库来使用。
处理数据
cJSON *json NULL;
cJSON *jdata NULL;
cJSON *jlists NULL;
cJSON *jlist NULL;json cJSON_Parse(resp-response); // 从项目接口中返回的Json格式的数据
if (json NULL)
{// 解析失败的情况下进行错误处理。const char *error_ptr cJSON_GetErrorPtr();if (error_ptr ! NULL){fprintf(stderr, Error before: %s\n, error_ptr);}return OSMP_ERR;
}
// 获取对应的节点下的数据。我的项目中数据列表在{ data: { list: { xxx } } } 下。
// 可以seek到对应的节点下获取到节点数据进行处理。
jdata cJSON_GetObjectItemCaseSensitive(json, data);
jlists cJSON_GetObjectItemCaseSensitive(jdata, list);// 循环处理列表中的每一条数据。
// cJson通过一个macro来组织循环处理列表中的处理。为了便于Java开发同学理解相当于Java中的
// for(String item : arrayList ) {
// System.out.println(item);
// }
cJSON_ArrayForEach(jlist, jlists)
{cJSON *id cJSON_GetObjectItemCaseSensitive(jlist, id);cJSON *projectnum cJSON_GetObjectItemCaseSensitive(jlist, projectnum);cJSON *name cJSON_GetObjectItemCaseSensitive(jlist, name);cJSON *status cJSON_GetObjectItemCaseSensitive(jlist, status);cJSON *contractamount cJSON_GetObjectItemCaseSensitive(jlist, contractamount);cJSON *income cJSON_GetObjectItemCaseSensitive(jlist, income);cJSON *actualpayment cJSON_GetObjectItemCaseSensitive(jlist, actualpayment);cJSON *managerName cJSON_GetObjectItemCaseSensitive(jlist, managerName);cJSON *nextmilestone cJSON_GetObjectItemCaseSensitive(jlist, nextmilestone);cJSON *plancomplettime cJSON_GetObjectItemCaseSensitive(jlist, plancomplettime);cJSON *countdown cJSON_GetObjectItemCaseSensitive(jlist, countdown);// 组装sql进行后处理。char* sql (char*)malloc(sizeof(char*)*10240);sprintf(sql, insert into utmp_projectpageqrydetailinformation(id, projectnum, name ,status, contractamount, income, actualpayment, manager_name, nextmilestone, plancomplettime, countdown) values(%d, %s, %s, %s, %d, %d, %d, %s, %s, %s, %s);, id-valueint, projectnum-valuestring, name-valuestring, status-valuestring, contractamount-valueint, income-valueint, actualpayment-valueint, managerName-valuestring, nextmilestone-valuestring, plancomplettime-valuestring, countdown-valuestring);
}
// 后续可以做一些资源清理操作防止memory leak导致应用coredump.如果有什么使用上的问题欢迎留言一起讨论。