json解析

 cJSON_Parse如果创建失败,内存空间会自动释放,不用关心,当成功创建非NULL的对象,就需要在使用完后手动释放(cJSON_Delete)

	cJSON *root = NULL;
	do
	{
		root = cJSON_Parse(msg);
		if (root == NULL)
		{
			pr_err("格式异常\r\n");
			break;
		}

		cJSON *control_str = cJSON_GetObjectItem(root, "control");
		if (control_str == NULL)
		{
			pr_err("control err\r\n");
			break;
		}

		pr_dbg("control>%s\r\n", control_str->valuestring);

	} while (0);
	if (root)
		cJSON_Delete(root);

json编码

使用cJSON_CreateObject函数创建JSON对象,使用完对象后主动释放json对象,cJSON_Delete函数会释放子节点的对象,如下dt和option加入root后,释放root时会自动释放dt和option,重复释放一个json会造成异常。

	root = NULL;
	cJSON *dt = NULL;
	cJSON *option = NULL;
	do
	{
		root = cJSON_CreateObject();
		if (root == NULL)
		{
			pr_err("root null\r\n");
			break;
		}
		cJSON_AddStringToObject(root, "id", "123001");
		cJSON_AddStringToObject(root, "control", "status");
		dt = cJSON_CreateObject();
		if (dt == NULL)
		{
			pr_err("dt null\r\n");
			break;
		}
		cJSON_AddBoolToObject(dt, "param1", false);
		cJSON_AddBoolToObject(dt, "param2", false);
		cJSON_AddItemToObject(root, "data", dt);
		option = cJSON_CreateObject();
		if (option == NULL)
		{
			pr_err("option null\r\n");
			break;
		}
		cJSON_AddStringToObject(option, "version", version);
		cJSON_AddItemToObject(root, "option", option);
		string str = cJSON_PrintUnformatted(root);
		cJSON_Delete(root);
		root = NULL;
		if (str == NULL)
		{
			pr_err("str null\r\n");
			break;
		}
         pr_dbg("%s\r\n",str);
		free((void *)str);
	} while (0);
	if (root)
		cJSON_Delete(root);
{
    "id":"123001",
    "control":"status",
    "data":{
        "param1":false,
        "param2":false
    },
    "option":{
        "version":"V1.0"
    }
}

GitHub 加速计划 / cj / cJSON
12
3
下载
Ultralightweight JSON parser in ANSI C
最近提交(Master分支:8 天前 )
c859b25d 7 天前
74e1ff49 this fixes CVE-2025-57052 11 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐