在C语言中如何创建JSON数据
在C语言中处理JSON数据时,由于标准库本身不包含JSON相关的功能,我们需要借助第三方库来实现JSON的创建、解析和操作,C语言中常用的JSON库包括 cJSON(轻量级、广泛使用)、Jansson(功能丰富、易用)和 json-c(社区维护、稳定)。cJSON 因其简洁高效、API直观,成为初学者和开发者的首选,本文将以 cJSON 为例,详细介绍如何在C语言中创建JSON数据。
cJSON库简介
cJSON是一个用C语言编制的轻量级JSON解析器,支持JSON数据的创建、解析、修改和序列化,它具有以下特点:
- 轻量级:核心代码仅约2000行,无外部依赖,适合嵌入式系统和资源受限环境。
- 易用性:API设计直观,通过链式操作即可构建复杂JSON结构。
- 功能完整:支持JSON对象()、数组(
[])、字符串、数字、布尔值和null等所有JSON数据类型。
环境准备:安装cJSON库
在使用cJSON之前,需要先安装或下载cJSON库,以下是不同平台的安装方法:
Linux系统(Ubuntu/Debian)
通过包管理器直接安装:
sudo apt-get update sudo apt-get install libcjson-dev
安装后,头文件位于 /usr/include/cjson.h,库文件位于 /usr/lib/x86_64-linux-gnu/libcjson.so(路径可能因系统而异)。
Windows系统
- 方法1:从GitHub下载源码编译
- 访问 cJSON官方GitHub仓库,下载最新源码。
- 使用Visual Studio或MinGW编译源码,生成
cjson.lib(静态库)和cjson.dll(动态库)。
- 方法2:使用vcpkg包管理器
vcpkg install cjson
macOS系统
通过Homebrew安装:
brew install cjson
创建JSON数据的基本步骤
使用cJSON创建JSON数据的核心步骤如下:
- 包含头文件:引入
cjson.h。 - 创建JSON对象/数组:通过
cJSON_CreateObject()或cJSON_CreateArray()创建根节点。 - 添加子元素:使用
cJSON_AddStringToObject()、cJSON_AddNumberToObject()等函数向对象/数组中添加数据。 - 构建嵌套结构:通过递归或链式操作创建多层嵌套的JSON数据。
- 序列化JSON:将cJSON对象转换为字符串(
char*),便于存储或传输。 - 释放内存:调用
cJSON_Delete()释放cJSON对象占用的内存,避免内存泄漏。
实战案例:创建复杂JSON数据
假设我们需要创建以下JSON数据,包含用户信息、技能列表和地址嵌套结构:
{
"name": "张三",
"age": 25,
"isStudent": false,
"skills": ["C", "Python", "JavaScript"],
"address": {
"city": "北京",
"district": "海淀区",
"zipCode": 100080
},
"contact": null
}
包含头文件并初始化
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "cjson.h" // 确保头文件路径正确
创建JSON对象(根节点)
// 创建根JSON对象
cJSON *root = cJSON_CreateObject();
if (root == NULL) {
fprintf(stderr, "Failed to create JSON object\n");
exit(EXIT_FAILURE);
}
添加基本类型数据(字符串、数字、布尔值、null)
// 添加字符串字段:name cJSON_AddStringToObject(root, "name", "张三"); // 添加数字字段:age cJSON_AddNumberToObject(root, "age", 25); // 添加布尔值字段:isStudent cJSON_AddBoolToObject(root, "isStudent", cJSON_False); // 添加null字段:contact cJSON_AddNullToObject(root, "contact");
创建并添加数组(skills)
// 创建skills数组
cJSON *skills = cJSON_CreateArray();
if (skills == NULL) {
fprintf(stderr, "Failed to create skills array\n");
cJSON_Delete(root); // 释放已分配的内存
exit(EXIT_FAILURE);
}
// 向数组中添加字符串元素
cJSON_AddItemToArray(skills, cJSON_CreateString("C"));
cJSON_AddItemToArray(skills, cJSON_CreateString("Python"));
cJSON_AddItemToArray(skills, cJSON_CreateString("JavaScript"));
// 将数组添加到根对象
cJSON_AddItemToObject(root, "skills", skills);
创建嵌套JSON对象(address)
// 创建address嵌套对象
cJSON *address = cJSON_CreateObject();
if (address == NULL) {
fprintf(stderr, "Failed to create address object\n");
cJSON_Delete(root);
exit(EXIT_FAILURE);
}
// 向address对象添加字段
cJSON_AddStringToObject(address, "city", "北京");
cJSON_AddStringToObject(address, "district", "海淀区");
cJSON_AddNumberToObject(address, "zipCode", 100080);
// 将address对象添加到根对象
cJSON_AddItemToObject(root, "address", address);
序列化JSON为字符串
// 将cJSON对象转换为格式化的JSON字符串(带缩进)
char *json_str = cJSON_Print(root);
if (json_str == NULL) {
fprintf(stderr, "Failed to serialize JSON\n");
cJSON_Delete(root);
exit(EXIT_FAILURE);
}
// 输出JSON字符串
printf("Generated JSON:\n%s\n", json_str);
// 释放JSON字符串内存(cJSON_Print使用malloc分配)
free(json_str);
释放cJSON对象内存
// 释放整个cJSON对象及其子节点 cJSON_Delete(root);
完整代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cjson.h"
int main() {
// 1. 创建根JSON对象
cJSON *root = cJSON_CreateObject();
if (root == NULL) {
fprintf(stderr, "Failed to create JSON object\n");
return EXIT_FAILURE;
}
// 2. 添加基本类型字段
cJSON_AddStringToObject(root, "name", "张三");
cJSON_AddNumberToObject(root, "age", 25);
cJSON_AddBoolToObject(root, "isStudent", cJSON_False);
cJSON_AddNullToObject(root, "contact");
// 3. 创建并添加skills数组
cJSON *skills = cJSON_CreateArray();
cJSON_AddItemToArray(skills, cJSON_CreateString("C"));
cJSON_AddItemToArray(skills, cJSON_CreateString("Python"));
cJSON_AddItemToArray(skills, cJSON_CreateString("JavaScript"));
cJSON_AddItemToObject(root, "skills", skills);
// 4. 创建并添加嵌套的address对象
cJSON *address = cJSON_CreateObject();
cJSON_AddStringToObject(address, "city", "北京");
cJSON_AddStringToObject(address, "district", "海淀区");
cJSON_AddNumberToObject(address, "zipCode", 100080);
cJSON_AddItemToObject(root, "address", address);
// 5. 序列化为JSON字符串
char *json_str = cJSON_Print(root);
if (json_str == NULL) {
fprintf(stderr, "Failed to serialize JSON\n");
cJSON_Delete(root);
return EXIT_FAILURE;
}
// 6. 输出结果
printf("Generated JSON:\n%s\n", json_str);
free(json_str);
// 7. 释放内存
cJSON_Delete(root);
return EXIT_SUCCESS;
}
编译与运行
Linux/macOS编译
使用gcc编译时,需链接cJSON库:
gcc -o create_json create_json.c -lcjson
运行程序:
./create_json
Windows编译(Visual Studio)
- 将cJSON源码(
cjson.h、cjson.c)添加到项目中。 - 项目属性中配置包含目录(指向c头文件所在目录)。
- 编译并运行。
输出结果
程序运行后,将输出格式化的JSON字符串:
Generated JSON:
{
"name": "张三",
"age": 25,
"isStudent": false,
"contact": null,
"skills": [
"C",
"Python",
"JavaScript"
],
"address": {
"city": "北京",
"district": "海淀区",


还没有评论,来说两句吧...