开发者社区> shuijing117> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

cJSON系列(1) - cJSON 入门与应用

简介: cJSON 入门与应用 1. cJSON简介 cJSON aims to be the dumbest possible parser that you can get your job done with. It's a single file of C, and a single header file. JSON is described best here: h
+关注继续查看

cJSON 入门与应用

1. cJSON简介

cJSON aims to be the dumbest possible parser that you can get your job done with. It's a single file of C, and a single header file.

JSON is described best here: http://www.json.org/ It's like XML, but fat-free. You use it to move data around, store things, or just generally represent your program's state.

cJSON 下载地址:https://github.com/DaveGamble/cJSON

2. cJSON常用函数简介

cJSON * cJSON_CreateObject();
创建一个json对象,返回一个cJSON结构体类型的指针。

cJSON *cJSON_CreateArray();
创建一个数组对象,返回一个cJSON结构体类型的指针。

cJSON *cJSON_CreateString(const char *string);
创建一个字符串对象,传入一个char *类型的字符串,返回一个cJSON结构体类型的指针。

void cJSON_AddItemToArray(cJSON *array, cJSON *item);
向数组对象中添加一个元素,传入参数array为cJSON *结构体类型的指针,为数组对象; item为添加入数字对象中的对象指针。

void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item);
向json对象中添加一对元素,object为json对象,string为加入一对元素中的name,item为加入一对元素中的value。

cJSON *cJSON_Parse(const char *value);
解析一个json串,传入一个json格式的字符串,返回一个cJSON *类型的结构体指针。

char  *cJSON_Print(cJSON *item);
将一个cJSON结构体代表的json对象转换为一个json格式的字符串。

void   cJSON_Delete(cJSON *c);
释放一个cJSON对象所占用的内存空间。

3. 应用

以此json串为例进行json的生成和解析:
{
	"name": "中国",
	"province": [{
		"name": "黑龙江",
		"cities": {
			"city": ["哈尔滨", "大庆"]
		}
	}, {
		"name": "广东",
		"cities": {
			"city": ["广州", "深圳", "珠海"]
		}
	}, {
		"name": "台湾",
		"cities": {
			"city": ["台北", "高雄"]
		}
	}, {
		"name": "新疆",
		"cities": {
		        "city": ["乌鲁木齐"]
		}
	}]
}

3.1 生成json

#include <stdio.h>

#include "cJSON.h"
#include "cJSON_Utils.h"

#pragma comment(lib,"cjson.lib")

int main(void)
{
	cJSON * json = cJSON_CreateObject();

	cJSON *provinceArray = cJSON_CreateArray();

	cJSON *heilongjiang = cJSON_CreateObject();
	cJSON *hljcities = cJSON_CreateObject();
	cJSON *hljcityArray = cJSON_CreateArray();

	cJSON *guangdong = cJSON_CreateObject();
	cJSON *gdcities = cJSON_CreateObject();
	cJSON *gdcityArray = cJSON_CreateArray();

	cJSON *taiwan = cJSON_CreateObject();
	cJSON *twcities = cJSON_CreateObject();
	cJSON *twcityArray = cJSON_CreateArray();

	cJSON *xinjiang = cJSON_CreateObject();
	cJSON *xjcities = cJSON_CreateObject();
	cJSON *xjcityArray = cJSON_CreateArray();
	
	cJSON_AddStringToObject(json, "name", "中国");

	cJSON_AddStringToObject(heilongjiang, "name", "黑龙江");
	cJSON_AddItemToArray(hljcityArray, cJSON_CreateString("哈尔滨"));
	cJSON_AddItemToArray(hljcityArray, cJSON_CreateString("大庆"));
	cJSON_AddItemToObject(hljcities, "city", hljcityArray);
	cJSON_AddItemToObject(heilongjiang, "cities", hljcities);

	cJSON_AddStringToObject(guangdong, "name", "广东");
	cJSON_AddItemToArray(gdcityArray, cJSON_CreateString("广州"));
	cJSON_AddItemToArray(gdcityArray, cJSON_CreateString("深圳"));
	cJSON_AddItemToArray(gdcityArray, cJSON_CreateString("珠海"));
	cJSON_AddItemToObject(gdcities, "city", gdcityArray);
	cJSON_AddItemToObject(guangdong, "cities", gdcities);

	cJSON_AddStringToObject(taiwan, "name", "台湾");
	cJSON_AddItemToArray(twcityArray, cJSON_CreateString("台北"));
	cJSON_AddItemToArray(twcityArray, cJSON_CreateString("高雄"));
	cJSON_AddItemToObject(twcities, "city", twcityArray);
	cJSON_AddItemToObject(taiwan, "cities", twcities);

	cJSON_AddStringToObject(xinjiang, "name", "新疆");
	cJSON_AddItemToArray(xjcityArray, cJSON_CreateString("乌鲁木齐"));
	cJSON_AddItemToObject(xjcities, "city", xjcityArray);
	cJSON_AddItemToObject(xinjiang, "cities", xjcities);
	
	cJSON_AddItemToArray(provinceArray, heilongjiang);
	cJSON_AddItemToArray(provinceArray, guangdong);
	cJSON_AddItemToArray(provinceArray, taiwan);
	cJSON_AddItemToArray(provinceArray, xinjiang);

	cJSON_AddItemToObject(json, "province", provinceArray);


	printf("%s\n", cJSON_Print(json));


	if ( NULL != json )
	{
		cJSON_Delete(json);
		json = NULL;
	}
	
	return 0;
}

3.2 解析json

#include <stdio.h>

#include "cJSON.h"
#include "cJSON_Utils.h"


#pragma comment(lib,"cjson.lib")

int main(void)
{
 	const char *jsonStr = "{						\
 		\"name\": \"中国\",						\
 		\"province\": [{						\
 			\"name\": \"黑龙江\",					\
 			\"cities\": {						\
 				\"city\": [\"哈尔滨\", \"大庆\"]		\
 			}							\
 		}, {								\
 			\"name\": \"广东\",					\
 			\"cities\": {						\
 				\"city\": [\"广州\", \"深圳\", \"珠海\"]	\
 			}							\
 		}, {								\
 			\"name\": \"台湾\",					\
 			\"cities\": {						\
 				\"city\": [\"台北\", \"高雄\"]			\
 			}							\
 		}, {								\
 			\"name\": \"新疆\",					\
 			\"cities\": {						\
 			\"city\": [\"乌鲁木齐\"]				\
 			}							\
 		}]								\
 	}";

	cJSON *json = cJSON_Parse(jsonStr);

	if ( NULL != json )
	{
		cJSON * temp = cJSON_GetObjectItem(json, "name");

		if ( NULL != temp )
			printf( "name : %s\n", temp->valuestring);

		temp = cJSON_GetObjectItem(json, "province");

		printf( "province : \n");
		if ( NULL != temp )
		{
			int i = 0;
			int icount = cJSON_GetArraySize(temp);
			for (; i < icount; ++i)
			{
				cJSON * province = cJSON_GetArrayItem(temp, i);

				if ( NULL != province)
				{
					cJSON * name = NULL;
					cJSON * cities = NULL;
					
					name = cJSON_GetObjectItem(province, "name");
					cities = cJSON_GetObjectItem(province, "cities");
					if ( NULL != name )
						printf("    name : %s\n", name->valuestring);

					printf("    cities : \n");
					if ( NULL != cities )
					{
						cJSON * city = cJSON_GetObjectItem(cities, "city");
						printf ("        city:");
						if ( NULL != city )
						{
							int j = 0;
							int jcount = cJSON_GetArraySize(city);
							for (; j < jcount; ++j)
							{
								cJSON *cityItem = cJSON_GetArrayItem(city, j);
								if ( NULL != cityItem )
									printf ("%s ", cityItem->valuestring);
							}
						}
						printf ("\n\n");
					}
				}
			}
		}

		cJSON_Delete(json);
		json = NULL;
	}

	return 0;
}




版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Cloudera 流处理社区版(CSP-CE)入门
我们现在推出 Cloudera 流处理社区版 (CSP-CE),它使所有这些工具和技术可供开发人员和任何想要试验它们并了解流处理、Kafka 和他的朋友、Flink 和 SSB 的人随时可用。
28 0
CAD入门系列之Ⅱ
移动:点击移动,然后选中你所要移动的对象再按下空格。然后你要指定一个基点,如果你不知道要指定的话可以任意指定一个基点,移动到你想要移动的地方。移动的快捷键是:M+空格,当你有要求的时候记得对准它的一个基点的位置。
45 0
CSS基础入门(上)
WEB基础代码思维导图——CSS篇
42 0
Signalling entropy: A novel network-theoretical fram
摘要 系统生物学的一个关键挑战是阐明决定细胞表型的基本原理或基本定律。了解如何在癌症等疾病中改变这些基本原则对于将基础科学知识转化为临床进展非常重要。虽然正在取得重大进展,但通过系统生物学方法确定了新的药物靶点和治疗方法,我们仍然缺乏基本系统对某些治疗成功和其他治疗失败的理解。
1112 0
Ruby(1):入门
安装:   一般来说linux会自动装ruby,可以通过:  ruby -v 来查看ruby版本   直接使用ruby命令的话,是用来执行ruby文件的。如果要打开交互式ruby解释器。只需要在控制台输入:irb 即可。
815 0
CUDA入门(一)
CUDA环境的配置 在很多大数据处理、图像处理等环境下时,串行运算已经满足不了对速度的需求,这时就需要运用并行运算来提高运算的效率。 CUDA(Compute Unified Device Architecture),是显卡厂商NVIDIA推出的运算平台,也是典型的并行运算所用的工具之一(毕竟NVIDIA是显卡界的老大,听说AMD显卡也开始支持CUDA)。 首先先进行C
2675 0
+关注
23
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载