【cJSON | 使用教程】介绍 JSON 以及 cJSON 使用详细步骤

07-12 1462阅读

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀

🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭

🤣本文内容🤣:🍭介绍 cJSON 使用详细教程🍭

😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭

本文未经允许,不得转发!!!

目录

  • 🎄一、JSON 简介
    • ✨1.1 JSON 语法规则
    • ✨1.2 JSON 数据- 名称和值
    • 🎄二、cJSON
      • cJSON 交叉编译
      • 🎄三、使用 cJSON 创作JSON文本的步骤
      • 🎄四、使用 cJSON 解析JSON文本的步骤
      • 🎄五、总结

        【cJSON | 使用教程】介绍 JSON 以及 cJSON 使用详细步骤

        🎄一、JSON 简介

        JSON的全称是JavaScript Object Notation(JavaScript 对象标记法),是一种存储和交换数据的语法,是一种轻量级的数据交换格式。JSON 使用 JavaScript 语法,但是 JSON 格式是纯文本的,文本可被任何编程语言作为数据来读取和使用。JSON 格式最初由 Douglas Crockford 提出。

        ✨1.1 JSON 语法规则

        JSON 语法衍生于 JavaScript 对象标记法语法:

        • 数据在名称/值对中
        • 数据由逗号分隔
        • 花括号{}容纳对象
        • 方括号[]容纳数组

          ✨1.2 JSON 数据- 名称和值

          JSON对象需要使用花括号{}包含起来。JSON对象的内容就是一条条JSON数据,JSON数据直接用逗号分隔。

          JSON 数据写为名称/值的键值对,其中名称必须使用双引号,名称后面加冒号:和值就组成一个名称/值键值对,格式如下:

          { "name":value }
          

          JSON数据需要使用逗号分隔,如下:

          {
          	"name":value,
          	"name1":value1,
          	"name2":value2
          }
          

          JSON值

          JSON数据的值可以使用下面6个类型:

          • 字符串:用双引号""引起来的字符串;

            {"name": "Jack"}

          • 数字:可以是整数,也可以是浮点数;
            {
            	"age":18,
            	"weight":56.4
            }
            
          • 对象(JSON 对象):用花括号{}括起来的一组JSON数据 ;
            {
            	"information":{
            		"school": "编程大学",
                 	"grade":   4,
                 	"专业":    "软件工程"
            	}
            }
            
          • 数组:用方括号[]括起来的一组值;

            {"gf_age": [18, 20, 23, 25]}

          • 布尔值:true、false

            {"isBoy": true}

          • null

            {"studentPoint": null}


            【cJSON | 使用教程】介绍 JSON 以及 cJSON 使用详细步骤

            🎄二、cJSON

            cJSON是一个用C语言编写的JSON数据解析器,它轻便,可移植,是一个简单易用的解析器。它的源码文件只有两个:一个C 文件(cJSON.c)和一个头文件(cJSON.h)。因为它的简单易用,让其GitHub吸引了全球众多的程序员在它的基础上贡献代码。

            cJSON的Github地址:https://github.com/DaveGamble/cJSON

            拿到源码后,只需要两个源文件:cJSON.c、cJSON.h;其他文件编程时不需要。

            cJSON支持的类型有下面7种,跟前面说的JSON类型是可以对应上的:

            /* cJSON Types: */
            #define cJSON_Invalid (0)
            #define cJSON_False  (1 
                /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
                struct cJSON *next; // 指向下一条JSON数据
                struct cJSON *prev; // 指向上一条JSON数据
                
                /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
                struct cJSON *child; // 值为 对象/数组 时,child指向值的对象链表
                /* The type of the item, as above. */
                int type;
                /* The item's string, if type==cJSON_String  and type == cJSON_Raw */
                char *valuestring;
                /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
                int valueint;
                /* The item's number, if type==cJSON_Number */
                double valuedouble;
                /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
                char *string;	// JSON 数据的名称
            } cJSON;
            
                char* str = NULL;
                /* 创建一个JSON数据对象(链表头结点) */
                cJSON* cjson_root = cJSON_CreateObject();
                /* 添加一条字符串类型的JSON数据(添加一个链表节点) */
                cJSON_AddStringToObject(cjson_root, "name", "Jack");
                /* 添加一条整数类型的JSON数据(添加一个链表节点) */
                cJSON_AddNumberToObject(cjson_root, "age", 22);
                /* 添加一条浮点类型的JSON数据(添加一个链表节点) */
                cJSON_AddNumberToObject(cjson_root, "weight", 56.4);
                /* 创建一个JSON数据对象,并添加到cjson_root */
                cJSON* cjson_info = cJSON_CreateObject();
                cJSON_AddItemToObject(cjson_info, "school", cJSON_CreateString("编程大学"));
                cJSON_AddItemToObject(cjson_info, "grade", cJSON_CreateNumber(4));
            	cJSON_AddItemToObject(cjson_info, "专业", cJSON_CreateString("软件工程"));
            	
                cJSON_AddItemToObject(cjson_root, "information", cjson_info);
                /* 添加一个数组类型的JSON数据(添加一个链表节点) */
                cJSON* cjson_gfAge = cJSON_CreateArray();
                cJSON_AddItemToArray(cjson_gfAge, cJSON_CreateNumber(18));
            	cJSON_AddItemToArray(cjson_gfAge, cJSON_CreateNumber(20));
            	cJSON_AddItemToArray(cjson_gfAge, cJSON_CreateNumber(23));
            	cJSON_AddItemToArray(cjson_gfAge, cJSON_CreateNumber(25));
            	//cJSON_AddItemToArray(cjson_gfAge, 25); //数组里也要求是JSON数据,所以这样写是错误的
                cJSON_AddItemToObject(cjson_root, "gf_age", cjson_gfAge);
            	
            	/* 添加一个ture类型JSON数据(添加一个链表节点) */
            	cJSON_AddFalseToObject(cjson_root, "isBoy");
                /* 添加一个值为 False 的布尔类型的JSON数据(添加一个链表节点) */
                cJSON_AddNullToObject(cjson_root, "studentPoint");
                /* 打印JSON对象(整条链表)的所有数据 */
                str = cJSON_Print(cjson_root);
                printf("%s\n", str);
            	cJSON_Delete(cjson_root);
            	
                return 0;
            }
            
            	char *jsonBuf = 
            		"{\
            			\"name\": \"Jack\",						\
            			\"age\":  22,							\
            			\"weight\":       56.4,					\
            			\"information\":  {						\
            					\"school\":       \"编程大学\",	\
            					\"grade\":        4,			\
            					\"专业\": \"软件工程\"			\
            			},										\
            			\"gf_age\":       [18, 20, 23, 25],		\
            			\"isBoy\":        false,				\
            			\"studentPoint\": null					\
            		}";
            	//printf("[%s]\n", jsonBuf);
            	
            	// 解析JSON数据
            	cJSON* cjson_root = cJSON_Parse(jsonBuf);
            	if(cjson_root == NULL)
                {
                    printf("parse fail.\n");
                    return -1;
                }
            	
            	// 根据名称依次获取各个JSON数据对象
            	cJSON* cjson_name = cJSON_GetObjectItem(cjson_root, "name");
            	cJSON* cjson_age = cJSON_GetObjectItem(cjson_root, "age");
                cJSON* cjson_weight = cJSON_GetObjectItem(cjson_root, "weight");
            	printf("name=%s, age=%d weight=%f\n",
            		cJSON_GetStringValue(cjson_name), cjson_age-valueint, cJSON_GetNumberValue(cjson_weight));
            	
            	// JSON数据值是对象的解析
            	cJSON* cjson_info = cJSON_GetObjectItem(cjson_root, "information");
            	cJSON* cjson_info_school = cJSON_GetObjectItem(cjson_info, "school");
            	cJSON* cjson_info_grade = cJSON_GetObjectItem(cjson_info, "grade");
            	cJSON* cjson_info_speciality = cJSON_GetObjectItem(cjson_info, "专业");
            	printf("school=%s grade=%d 专业=%s\n",
            		cjson_info_school-valuestring, cjson_info_grade-valueint, cjson_info_speciality-valuestring);
            	
            	// JSON数据值是数组的解析
            	cJSON* cjson_gf_age = cJSON_GetObjectItem(cjson_root, "gf_age");
            	int arrSize=cJSON_GetArraySize(cjson_gf_age);
            	int i=0;
            	for(i=0; i
            		cJSON* cjson_index = cJSON_GetArrayItem(cjson_gf_age, i);
            		printf("array_%d=%d, ",i,cjson_index-valueint);
            	}
            	printf("\n");
            	
            	// JSON数据值是布尔值的解析
            	cJSON* cjson_isBoy = cJSON_GetObjectItem(cjson_root, "isBoy");
            	if(cJSON_IsFalse(cjson_isBoy))
            	{
            		printf("isBoy:false\n");
            	}
            	else if(cJSON_IsTrue(cjson_isBoy))
            	{
            		printf("isBoy:true\n");
            	}
            	
            	// JSON数据值是null的解析
            	cJSON* cjson_studentPoint = cJSON_GetObjectItem(cjson_root, "studentPoint");
            	if(cJSON_IsNull(cjson_studentPoint))
            	{
            		printf("studentPoint:null\n");
            	}
            	
            	cJSON_Delete(cjson_root);
            	
            	return 0;
            }
            
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]