使用cJSON解析JSON数据

作者:hahaya
日期:2014-04-25

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,可以把JSON的结构理解成无序的、可嵌套的key-value键值对集合,这些key-value键值对以结构体或数组的形式来组织的。同一级的key-value键值对之间用一个,(逗号)隔开,每个key-value键值对是由一个key后面紧接一个:(冒号),冒号后面是这个key对应的value。key是一个word,由大小写字母、下划线及数字组成,可以由双引号封闭,也可以不用双引号。而value的取值集为:number、boolean(true、false)、null、string、object和array。更多关于JSON的介绍,请自行google~

关于JSON的解析我使用的库是cJSON,cJSON是C语言写的一个JSON解析库,项目地址http://sourceforge.net/projects/cjson/,用起来比较简单、方便,在test.c文件中有很多使用的例子,如果不明白使用方法可以看看cJSON.h和cJSON.c,不是太深奥,实际上使用一个双链表来记录JSON数据,然后对这个双链表进行增删改查等操作。
下面就使用一个简单的例子来演示如何使用cJSON,假设有一个名为test的文件,其中的内容如下:

  1. {

  2. "name":"EVDI",

  3. "data":{

  4. "id":1,

  5. "username":"hahaya",

  6. "userpass":"123456",

  7. "version"

  8. }

  9. }

  10. #include <stdio.h>

  11. #include <stdlib.h>

  12. #include <string.h>

  13. #include <stdint.h>

  14. #include "cJSON.h" //需要把该头文件放在后面包含 否则会找不到size_t

  15. //解析JSON

  16. void parse_json(const char *filename)

  17. {

  18. printf("----------------parse json start-------------------------------\n");

  19. //从文件中读取要解析的JSON数据

  20. FILE *fp = fopen(filename, "r");

  21. fseek(fp, 0, SEEK_END);

  22. long len = ftell(fp);

  23. fseek(fp, 0, SEEK_SET);

  24. char *data = (char*)malloc(len + 1);

  25. fread(data, 1, len, fp);

  26. fclose(fp);

  27. printf("%s", data);

  28. //解析JSON数据

  29. cJSON *root_json = cJSON_Parse(data); //将字符串解析成json结构体

  30. if (NULL == root_json)

  31. {

  32. printf("error:%s\n", cJSON_GetErrorPtr());

  33. cJSON_Delete(root_json);

  34. return;

  35. }

  36. //"name":"EVDI"

  37. cJSON *name_json = cJSON_GetObjectItem(root_json, "name");

  38. if (name_json != NULL)

  39. {

  40. char *name = cJSON_Print(name_json); //将JSON结构体打印到字符串中 需要自己释放

  41. printf("name:%s\n", name);

  42. free(name);

  43. }

  44. //"data":"..."

  45. //id

  46. cJSON *data_json = cJSON_GetObjectItem(root_json, "data");

  47. int id = cJSON_GetObjectItem(data_json, "id")->valueint;

  48. printf("id:%d\n", id);

  49. //username

  50. char *username = cJSON_Print(cJSON_GetObjectItem(data_json, "username"));

  51. printf("username:%s\n", username);

  52. free(username);

  53. //userpass

  54. char *userpass = cJSON_Print(cJSON_GetObjectItem(data_json, "userpass"));

  55. printf("userpass:%s\n", userpass);

  56. free(userpass);

  57. //version

  58. char *version = cJSON_Print(cJSON_GetObjectItem(data_json, "version"));

  59. printf("version:%s\n", version);

  60. free(version);

  61. free(data);

  62. printf("----------------parse json end--------------------------------\n");

  63. }

  64. //创建JSON

  65. void create_json()

  66. {

  67. printf("----------------create json start-----------------------------\n");

  68. //组JSON

  69. cJSON *root_json = cJSON_CreateObject();

  70. cJSON_AddItemToObject(root_json, "name", cJSON_CreateString("EVDI"));

  71. cJSON *data_json = cJSON_CreateObject();

  72. cJSON_AddItemToObject(root_json, "data", data_json);

  73. //添加的另一种方式:cJSON_AddNumberToObject(data_json, "id", 1);通过源码发现仅仅是对cJSON_AddItemToObject的define

  74. cJSON_AddItemToObject(data_json, "id", cJSON_CreateNumber(1));

  75. //添加的另一种方式:cJSON_AddStringToObject(data_json, "username", "hahaya");

  76. cJSON_AddItemToObject(data_json, "username", cJSON_CreateString("hahaya"));

  77. cJSON_AddItemToObject(data_json, "userpass", cJSON_CreateString("123456"));

  78. cJSON_AddItemToObject(data_json, "version", cJSON_CreateString("1.0"));

  79. //打印JSON

  80. char *out = cJSON_Print(root_json);

  81. printf("%s\n", out);

  82. free(out);

  83. printf("----------------create json end-------------------------------\n");

  84. }

  85. int main()

  86. {

  87. parse_json("test");

  88. create_json();

  89. return 0;

  90. }

<<Nginx源码分析 --- 编译、安装 Nginx --- 内存分配>>

首页 - Wiki
Copyright © 2011-2025 iteam. Current version is 2.144.0. UTC+08:00, 2025-07-09 22:48
浙ICP备14020137号-1 $访客地图$