当前位置:   article > 正文

【嵌入式项目应用】__cJSON基础介绍与代码测试_嵌入式 json

嵌入式 json

目录

前言

一、JSON是什么?

1. JSON 基本语法

2. JSON值(value)的类型

3. 逻辑值(true 或 false)

4. null

5. NUMBER 数字(整数或浮点数)

6. STRING 字符串(在双引号""中)

7. ARRAY 数组(在中括号[]中)

8. OBJECT 对象(在大括号{}中)

二、cJSON又是什么

三、cJSON的编程实例

1. 例子1

2. 例子2

(* ̄︶ ̄)创作不易!期待你们的 点赞、收藏和评论喔。


前言

C语言开发中,你使用过cJSON吗?

在介绍cJSON之前,我们先来认识一下JSON。。。

一、JSON是什么?

JSON(JavaScript Object Notation)是一种轻量级数据交换格式。JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。

1. JSON 基本语法

  • 数据以key :value(名称/值) 的形式存在
  • 数据由逗号,分隔
  • 大括号{}保存对象
  • 中括号[]保存数组,数组可以包含多个对象

例如:

{ name : C Primer pluse, pages : 626 }

2. JSON值(value)的类型

  1. /* cJSON Types: */
  2. #define cJSON_False 0
  3. #define cJSON_True 1
  4. #define cJSON_NULL 2
  5. #define cJSON_Number 3
  6. #define cJSON_String 4
  7. #define cJSON_Array 5
  8. #define cJSON_Object 6

3. 逻辑值(true 或 false)

{"flag":true}

4. null

{"name":null}

5. NUMBER 数字(整数或浮点数

{"pages":200, "price":35.00}

6. STRING 字符串(在双引号""中)

{"book":"C Primer pluse"}

7. ARRAY 数组(在中括号[]中)

  1. [
  2. {"name":"C Primer pluse", "author":"Stephen Prata"},
  3. {"name":"C程序设计", "author":"谭浩强"},
  4. {"name":"C陷阱与缺陷", "author":"Andrew Koenig"}
  5. ]

8. OBJECT 对象(在大括号{}中)

{"name":"C Primer pluse", "author":"Stephen Prata"}

当然对象内部也可以是数组,比如:

  1. {
  2. "books":[
  3. {"name":"C Primer pluse", "author":"Stephen Prata"},
  4. {"name":"C程序设计", "author":"谭浩强"},
  5. {"name":"C陷阱与缺陷", "author":"Andrew Koenig"}
  6. ]
  7. }

对象 books 内部是一个数组,该数组又包含了三个对象。

二、cJSON又是什么

cJSON是一个基于C的JSON解析库,这个库非常简短,源码内容只包含:一个 cJSON.h头文件 和一个 cJSON.c源文件 ,支持JSON的解析和封装,需要调用时,只需要#include "cJSON.h"就可以使用了。

cJSON源文件开源项目地址:https://sourceforge.net/projects/cjson/icon-default.png?t=N7T8https://sourceforge.net/projects/cjson/

三、cJSON的编程实例

1. 例子1

先演示一个最简单的JSON数据,如何使用cJSON库来解析。

用于测试JSON数据,我们先用一个char型的字符串了保存,注意,由于JSON对象的key和value都需要使用引号(数值或逻辑型value除外),所以,

使用C语言的字符串来保存JSON数据,在遇到引号时,要加反斜杠来转义

解析JSON数据时,首先要调用 cJSON_Parse() 这个函数,将JSON数据解析为 cJSON型的对象

  1. cJSON *srcJsonData = cJSON_Parse(jsonData);

然后就可以使用cJSON库中提供的各种函数来操作这个对象。比如 :

  1. value = cJSON_GetObjectItem(srcJsonData,"name");

就是通过 cJSON_GetObjectItem() 来获取JSON数据中的一项数据,并通过指定key的方式来获取对应的value。

整个测试程序如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "cJSON.h"
  4. void main(void)
  5. {
  6. char jsonData[] = "{\"name\":\"C Primer pluse\",\"pages\":626}";
  7. cJSON *srcJsonData = cJSON_Parse(jsonData);
  8. if(!srcJsonData)
  9. {
  10. printf("Error:%s\r\n",cJSON_GetErrorPtr());
  11. }
  12. else
  13. {
  14. /*获取Json数据的内容*/
  15. cJSON *value;
  16. value = cJSON_GetObjectItem(srcJsonData,"name");/*通过key来获取value*/
  17. if(value->type == cJSON_String)/*字符串型的value*/
  18. {
  19. printf("书名:%s\r\n",value->valuestring);
  20. }
  21. value = cJSON_GetObjectItem(srcJsonData,"pages");/*通过key来获取value*/
  22. if(value->type == cJSON_Number)/*数值型的value*/
  23. {
  24. printf("页数:%d\r\n",value->valueint);
  25. }
  26. cJSON_Delete(srcJsonData);
  27. }
  28. }

运行结果:

书名:C Primer pluse
页数:626

--------------------------------
Process exited after 0.01452 seconds with return value 0
请按任意键继续. . .

2. 例子2

上面是一个最基本的测试程序,JSON数据也是直接通过C语言的字符串保存的。

实际的使用中,JSON数据的内容较为庞大,再使用C语言的字符串来保存,则会及其麻烦(想想那一堆反斜杠)。

所以,一般都是使用文件的形式来保存JSON数据

准备一个原始数据用于测试,如下面的data.txt:

  1. {
  2. "class":"C语言书籍",
  3. "books":[{
  4. "name":"C Primer pluse",
  5. "author":"Stephen Prata",
  6. "publishing":"人民邮电出版社"
  7. },
  8. {
  9. "name":"C程序设计",
  10. "author":"谭浩强",
  11. "publishing":"清华大学出版社"
  12. },
  13. {
  14. "name":"C陷阱与缺陷",
  15. "author":"Andrew Koenig",
  16. "publishing":"人民邮电出版社"
  17. }]
  18. }

先来分析下这个JSON数据的结构:

  • 最外面的大括号,表示这个一个JSON对象

  • 对象里面有2个数据,key1是class,key2是books

  • books的value又是一个中括号表示的数组

  • 数组内又包含了3个对象,每个对象有3个数据,key1是name,key2是author,key3是publishing

解析这种JSON文件,使用要使用 fopen() 来打开这个文件:

FILE *fp = fopen("data.txt", "r");

这里还要使用 fseek() 和 ftell() 来计算文件的大小,目的是用于后面的分配内存时指定大小。

然后使用 fread() 将文件内存读入内存中分配的buf中:

fread(buf, fileSize, sizeof(char), fp);

接着,还是使用 cJSON_Parse() 将JSON数据解析为 cJSON型的对象

cJSON *srcJsonData = cJSON_Parse(buf);

然后就可以使用cJSON库中提供的各种函数来操作这个对象了。

这次会用到 cJSON_GetObjectItem()cJSON_GetArrayItem()cJSON_GetArraySize()cJSON_Print() 等函数。

注意是使用完cJSON_Print()后,要使用 free() 来释放。

具体的测试程序如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <memory.h>
  4. #include "cJSON.h"
  5. void main(void)
  6. {
  7. /*打开JSON文件*/
  8. FILE *fp = fopen("data.txt", "r");
  9. if(fp == NULL)
  10. {
  11. return;
  12. }
  13. /*计算文件大小*/
  14. int fileSize;
  15. fseek(fp, 0, SEEK_END);/*先移到文件末尾*/
  16. fileSize = ftell(fp);/*计算文件的大小*/
  17. printf("fileSize: %d\r\n", fileSize);
  18. fseek(fp, 0, SEEK_SET);/*再移到文件开头*/
  19. /*根据文件大小分配内存,并读取文件到内存*/
  20. char *buf = (char *)malloc(fileSize * sizeof(char));
  21. memset(buf, 0, fileSize);
  22. int ret = fread(buf, fileSize, sizeof(char), fp);
  23. if(ret == -1)
  24. {
  25. fclose(fp);
  26. return;
  27. }
  28. printf("%s\r\n",buf);
  29. fclose(fp);
  30. /*把该字符串数据转成JSON数据*/
  31. cJSON *srcJsonData = cJSON_Parse(buf);
  32. free(buf);
  33. if(srcJsonData == NULL)
  34. {
  35. printf("err\r\n");
  36. return;
  37. }
  38. cJSON *value;
  39. /*根据key值(class)获取对应的value*/
  40. value = cJSON_GetObjectItem(srcJsonData, "class");
  41. if(value == NULL)
  42. {
  43. printf("GetObjectItem err\r\n");
  44. cJSON_Delete(srcJsonData);
  45. return;
  46. }
  47. /*把value转成字符串输出*/
  48. char *data = cJSON_Print(value);
  49. printf("class = %s\r\n",data);
  50. free(data);
  51. /*根据key值(books)获取对应的value*/
  52. value = cJSON_GetObjectItem(srcJsonData, "books");
  53. if(value == NULL)
  54. {
  55. printf("GetObjectItem err\r\n");
  56. cJSON_Delete(srcJsonData);
  57. return;
  58. }
  59. /*获取该数组对象的大小*/
  60. int len = cJSON_GetArraySize(value);
  61. printf("books data: len=%d\r\n",len);
  62. /*访问books中的每一项*/
  63. int i = 0;
  64. for(i=0; i<len; i++)
  65. {
  66. /*先获取每一条信息*/
  67. cJSON *tmpValue = cJSON_GetArrayItem(value,i);
  68. /*再获取每条信息中的具体内容*/
  69. cJSON *nameValue = cJSON_GetObjectItem(tmpValue,"name");
  70. cJSON *authorValue = cJSON_GetObjectItem(tmpValue,"author");
  71. cJSON *publishValue = cJSON_GetObjectItem(tmpValue,"publishing");
  72. if(nameValue == NULL || authorValue == NULL || publishValue == NULL)
  73. {
  74. printf("GetObjectItem err\r\n");
  75. cJSON_Delete(srcJsonData);
  76. return;
  77. }
  78. /*打印出来*/
  79. char *print1 = cJSON_Print(nameValue);
  80. char *print2 = cJSON_Print(authorValue);
  81. char *print3 = cJSON_Print(publishValue);
  82. printf("[%d] %s \t %s \t %s\r\n",i+1,print1,print2,print3);
  83. free(print1);
  84. free(print2);
  85. free(print3);
  86. }
  87. cJSON_Delete(srcJsonData);
  88. }

运行结果

fileSize: 433
{
   "class":"C语言书籍",
   "books":[{
       "name":"C Primer pluse",
       "author":"Stephen Prata",
       "publishing":"人民邮电出版社"
      },

      {
       "name":"C程序设计",
       "author":"谭浩强",
       "publishing":"清华大学出版社"
      },

      {
       "name":"C陷阱与缺陷",
       "author":"Andrew Koenig",
       "publishing":"人民邮电出版社"
      }]
}
class = "C语言书籍"
books data: len=3
[1] "C Primer pluse"     "Stephen Prata"         "人民邮电出版社"
[2] "C程序设计"          "谭浩强"        "清华大学出版社"
[3] "C陷阱与缺陷"        "Andrew Koenig"         "人民邮电出版社"

--------------------------------
Process exited after 0.01578 seconds with return value 0
请按任意键继续. . .


(* ̄︶ ̄)创作不易!期待你们的 点赞收藏评论喔。

本文来源网络,免费分享知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除!  

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/729369
推荐阅读
相关标签
  

闽ICP备14008679号