C语言处理json字符串

Posted jkred369

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言处理json字符串相关的知识,希望对你有一定的参考价值。

JSON语法说明 

  先来看一个简单的JSON

复制代码
 1 {
 2   "stars": [
 3     {
 4       "name": "Faye",
 5       "address": "北京"
 6     },
 7     {
 8       "name": "andy",
 9       "address": "香港"
10     },
11     {
12       "name": "eddie",
13       "address": "台湾"
14     },
15     
16   ]
17 }
复制代码

    JSON 语法是 javascript 对象表示法语法的子集。数据在键/值对中;数据由逗号分隔;花括号保存对象, 也称一个文档对象;方括号保存数组, 每个数组成员用逗号隔开, 并且每个数组成员可以是文档对象或者数组或者键值对 。

JSON基于两种结构:
    “名称/值”对的集合(A collection of name/value pairs)。不同的编程语言中,它被理解为对象(object),纪录(record),结构(struct),字(dictionary),哈希表(hashtable),有键列表(keyed list),或者关联数组 (associative array)。
    值的有序列表(An ordered list of values)。在大部分语言中,它被实现为数组(array),矢量(vector),列表(list),序列(sequence)。 

JSON的三种语法: 

    键/值对 key:value,用半角冒号分割。 比如 "name":"Faye" 
    文档对象 JSON对象写在花括号中,可以包含多个键/值对。比如{ "name":"Faye" ,"address":"北京" }。 
    数组 JSON 数组在方括号中书写: 数组成员可以是对象,值,也可以是数组(只要有意义)。 {"love": ["乒乓球","高尔夫","斯诺克","羽毛球","LOL","撩妹"]} 

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

cJSON库在使用的时候只需要如下两步:cJSON.c(或者库文件和 cJSON.h添加到项目中即可;如果在命令行中进行链接 还需要加上-lm 表示链接math库 .


C语言函数库写JSON文件 :

    从缓冲区中解析出JSON结构:extern cJSON *cJSON_Parse(const char *value); 
        解析一块JSON数据返回cJSON结构, 在使用完之后调用cJSON_Delete函数释放json对象结构。

    将传入的JSON结构转化为字符串 :extern char *cJSON_Print(cJSON *item); 
        可用于输出到输出设备, 使用完之后free(char *) 。

    将JSON结构所占用的数据空间释放 :void cJSON_Delete(cJSON *c)

    创建一个值类型的数据 :extern cJSON *cJSON_CreateNumber(double num);
                extern cJSON *cJSON_CreateString(const char *string);
                extern cJSON *cJSON_CreateArray(void);

    创建一个对象(文档) :extern cJSON *cJSON_CreateObject(void);

    数组创建以及添加 :cJSON *cJSON_CreateIntArray(const int *numbers,int count);
              void cJSON_AddItemToArray(cJSON *array, cJSON *item);

    JSON嵌套 :

          【 向对象中增加键值对】 cJSON_AddItemToObject(root, "rows", 值类型数据相关函数());
          【 向对象中增加数组】 cJSON_AddItemToObject(root, "rows", cJSON_CreateArray());
          【 向数组中增加对象】 cJSON_AddItemToArray(rows, cJSON_CreateObject());

    几个能提高操作效率的宏函数 :#define cJSON_AddNumberToObject(object,name,n) \\
                        cJSON_AddItemToObject(object, name,cJSON_CreateNumber(n))
                   #define cJSON_AddStringToObject(object,name,s)\\
                        cJSON_AddItemToObject(object, name, cJSON_CreateString(s)) 


C语言库函数解析JSON文件 :

    根据键找json结点 :extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string)

    判断是否有keystring的项 如果有返回否则返回0 :extern int cJSON_HasObjectItem(cJSON *object,const char *string)
                      { return cJSON_GetObjectItem(object,string)?1:0; }

    返回数组结点array中成员的个数 :extern int cJSON_GetArraySize(cJSON *array);

    根据数组下标indexarray数组结点的第index个成员 返回该成员节点 :extern cJSON *cJSON_GetArrayItem(cJSON *array,int index);

    遍历数组 :#define cJSON_ArrayForEach(pos, head)        for(pos = (head)->child; pos != NULL; pos = pos->next)   


我们先来小试牛刀,编写一个输出到屏幕的简单json结构,代码1如下:

复制代码
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include"cJSON.h"
 4 
 5 int main(void)
 6 {
 7     char *data = "{\\"love\\":[\\"LOL\\",\\"Go shopping\\"]}";
 8     //从缓冲区中解析出JSON结构
 9     cJSON * json= cJSON_Parse(data);
10     
11     //将传入的JSON结构转化为字符串 并打印
12     char *json_data = NULL;
13     printf("data:%s\\n",json_data = cJSON_Print(json));
14     
15     free(json_data);
16     //将JSON结构所占用的数据空间释放
17     cJSON_Delete(json);
18     return 0;
19 }
复制代码

如下所示编译程序,执行程序,可以看到屏幕输出一个简单的json结构

下面我们在改进一下程序,输出到屏幕的同时,生成对应的json文件,代码2如下:

复制代码
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include"cJSON.h"
 5 
 6 int main(void)
 7 {
 8     char *char_json = "{\\"habit\\":\\"lol\\"}";
 9     //从缓冲区中解析出JSON结构
10     cJSON *json = cJSON_Parse(char_json);
11     //将传入的JSON结构转化为字符串 并打印
12     char *buf = NULL;
13     printf("data:%s\\n",buf = cJSON_Print(json));
14     //打开一个exec.json文件,并写入json内容
15     FILE *fp = fopen("exec.json","w");
16     fwrite(buf,strlen(buf),1,fp);
17     
18     fclose(fp);
19     free(buf);
20     cJSON_Delete(json);
21     return 0;
22 }
复制代码

如下图所示进行编译,执行程序,查看生成的对应的json文件

下面我们生成一个生成一个json结构稍微复杂一点的json文件,代码3如下:

复制代码
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include"cJSON.h"
 5 
 6 int main(void)
 7 {
 8     //创建一个空的文档(对象)
 9     cJSON *json = cJSON_CreateObject();
10     
11     //向文档中增加一个键值对{"name":"王大锤"}
12     cJSON_AddItemToObject(json,"name",cJSON_CreateString("王大锤"));
13     //向文档中添加一个键值对
14     //cJSON_AddItemToObject(json,"age",cJSON_CreateNumber(29));
15     cJSON_AddNumberToObject(json,"age",29);
16     
17     cJSON *array = NULL;
18     cJSON_AddItemToObject(json,"love",array=cJSON_CreateArray());
19     cJSON_AddItemToArray(array,cJSON_CreateString("LOL"));
20     cJSON_AddItemToArray(array,cJSON_CreateString("NBA"));
21     cJSON_AddItemToArray(array,cJSON_CreateString("Go shopping"));
22     
23     cJSON_AddNumberToObject(json,"score",59);
24     cJSON_AddStringToObject(json,"address","beijing");
25     
26     //将json结构格式化到缓冲区
27     char *buf = cJSON_Print(json);
28     //打开文件写入json内容
29     FILE *fp = fopen("create.json","w");
30     fwrite(buf,strlen(buf),1,fp);
31     free(buf);
32     fclose(fp);
33     //释放json结构所占用的内存
34     cJSON_Delete(json);
35     return 0;
36 }
复制代码

编译程序,执行程序,查看生成的json文件

下面再来编写一个,代码4如下:

复制代码
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #include"cJSON.h"
 5 
 6 int main(void)
 7 {
 8     //先创建空对象
 9     cJSON *json = cJSON_CreateObject();
10     //在对象上添加键值对
11     cJSON_AddStringToObject(json,"country","china");
12     //添加数组
13     cJSON *array = NULL;
14     cJSON_AddItemToObject(json,"stars",array=cJSON_CreateArray());
15     //在数组上添加对象
16     cJSON *obj = NULL;
17     cJSON_AddItemToArray(array,obj=cJSON_CreateObject());
18     cJSON_AddItemToObject(obj,"name",cJSON_CreateString("Faye"));
19     cJSON_AddStringToObject(obj,"address","beijing");
20     //在对象上添加键值对
21     cJSON_AddItemToArray(array,obj=cJSON_CreateObject());
22     cJSON_AddItemToObject(obj,"name",cJSON_CreateString("andy"));
23     cJSON_AddItemToObject(obj,"address",cJSON_CreateString("HK"));
24     
25     cJSON_AddItemToArray(array,obj=cJSON_CreateObject());
26     cJSON_AddStringToObject(obj,"name","eddie");
27     cJSON_AddStringToObject(obj,"address","TaiWan");
28     
29     //清理工作
30     FILE *fp = fopen("create.json","w");
31     char *buf = cJSON_Print(json);
32     fwrite(buf,strlen(buf),1,fp);
33     fclose(fp);
34     cJSON_Delete(json);
35     return 0;
36 }
复制代码

编译执行程序,效果如下图所示:

写了这么多生成xml的例子,下面我们来一个解析的例子,代码5如下:

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

编译程序,执行程序,解析出json信息如下图所示,


  

关于更多的json学习,可以自己根据提供的cJSON.h cJSON.c进行深入的学习,学无止境,我这里就介绍到这里了。

以上是关于C语言处理json字符串的主要内容,如果未能解决你的问题,请参考以下文章

vs code 自定义代码片段

Go语言处理JSon字段

JSON解析器json-c

C语言代码片段

怎么从JSON GET请求中得到一个字符串?

Go语言JSON 处理