1. JSON是什么?
官方描述:
以上从JSON的概念,用途,支持平台三个方面解释了JSON是什么的问题。现在说下我个人的理解。
2. JSON对象是什么? JSON数据是什么? JSON数据字符串是什么?
3. cJSON基本函数的使用。JSON数据格式检查工具:https://www.sojson.com/
//以下列JSON数据的合成和分解为例。
{
"name": "李四",
"age": 25,
"height": 173.56,
"course": ["Chinese", "English", "math", "physics"],
"scores": {
"Chinese": 89,
"English": 130,
"math": 100,
"physics": 90
}
}
#include <stdio.h>
#include "cJSON.h"
int main()
{
char json_str[1024] = {0};
printf_s("---->---->---->---->JSON数据合成---->---->---->---->\n");
//添加键值对函数cJSON_AddItemToArray()参数1是目的对象,参数2是键名,参数3是键值。
//创建JSON对象,分配内存块存储JSON数据。
cJSON* root = cJSON_CreateObject();
//添加键值对到JSON对象,键值是字符串。
cJSON_AddStringToObject(root, "name", "李四");
//添加键值对到JSON对象,键值是数字。
cJSON_AddNumberToObject(root, "age", 25);
//添加键值对到JSON对象,键值是数字。
cJSON_AddNumberToObject(root, "height", 173.56);
//添加键值对到JSON对象,键值是数组。
cJSON *course = cJSON_CreateArray();
//添加成员到数组,因为参数2是cJON*类型,所以需要cJSON_CreateString创建。
cJSON_AddItemToArray(course, cJSON_CreateString("Chinese"));
cJSON_AddItemToArray(course, cJSON_CreateString("English"));
cJSON_AddItemToArray(course, cJSON_CreateString("math"));
cJSON_AddItemToArray(course, cJSON_CreateString("physics"));
//添加数组course到root对象。
cJSON_AddItemToObject(root, "course", course);
cJSON* scores = cJSON_CreateObject();
cJSON_AddItemToObject(scores, "Chinese", cJSON_CreateNumber(89));
cJSON_AddItemToObject(scores, "English", cJSON_CreateNumber(130));
cJSON_AddItemToObject(scores, "math", cJSON_CreateNumber(100));
cJSON_AddItemToObject(scores, "physics", cJSON_CreateNumber(90));
//添加scores到root对象。
cJSON_AddItemToObject(root, "scores", scores);
//JSON数据组织完成,非格式化打印出来进行测试, 会申请额外内存。
const char *cjson_unformat_str = cJSON_PrintUnformatted(root);
//格式化打印出来进行测试,会申请额外内存。
const char* cjson_format_str = cJSON_Print(root);
//cJSON_PrintBuffered(root, 1024, 1);
//销毁JSON对象,释放JSON数据占用的内存块。
cJSON_Delete(root);
root = NULL;
//cJSON_PrintUnformatted cJSON_Print 会申请内存,所以使用完后要释放。
printf_s("----> cjson_unformat_str: %s\n\n", cjson_unformat_str);
printf_s("----> cjson_format_str: %s\n", cjson_format_str);
//保留一份副本。
strcpy(json_str, cjson_unformat_str);
free(cjson_unformat_str);
cjson_unformat_str = NULL;
free(cjson_format_str);
cjson_format_str = NULL;
printf_s("---->---->---->---->JSON数据分解---->---->---->---->\n");
//解析JSON字符串为JSON对象。
root = cJSON_Parse(json_str);
if (NULL == root) {
printf_s("----> cJSON_Parse failed\n");
return -1;
}
//获取name键值的cJSON对象。
cJSON* name = cJSON_GetObjectItem(root, "name");
cJSON* age = cJSON_GetObjectItem(root, "age");
cJSON* height = cJSON_GetObjectItem(root, "height");
printf("----> name: %s\n", name->valuestring);
printf("----> age: %d\n", age->valueint);
printf("----> height: %lf\n", height->valuedouble);
//获取course键值的cJSON对象。
course = cJSON_GetObjectItem(root, "course");
//获取数组大小
int array_size = cJSON_GetArraySize(course);
//循环获取数组元素的cJSON对象
cJSON* item = NULL;
for (int i = 0; i < array_size; i++) {
item = cJSON_GetArrayItem(course, i);
printf("----> Array[%d]: %s\n", i, item->valuestring);
}
//获取scores键值的cJSON对象。
scores = cJSON_GetObjectItem(root, "scores");
cJSON* Chinese = cJSON_GetObjectItem(scores, "Chinese");
cJSON* English = cJSON_GetObjectItem(scores, "English");
cJSON* math = cJSON_GetObjectItem(scores, "math");
cJSON* physics = cJSON_GetObjectItem(scores, "physics");
printf_s("----> Chinese: %d\n", Chinese->valueint);
printf_s("----> English: %d\n", English->valueint);
printf_s("----> math: %d\n", math->valueint);
printf_s("----> physics: %d\n", physics->valueint);
cJSON_Delete(root);
root = NULL;
while (1)
;
}