CJSON之完全基于C库函数的使用

最近由于需要两个单片机之间的数据传输,所以了解到了CJSON。

1.JSON简介

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。类似 XML,但是比XML 更小、更快,更易解析。

2.JSON语法

JSON 是存储和交换文本信息的语法。既然是语法,就有它的规则。
JSON语法规则总结起来就四点:
1.数据在名称/值对中
2.数据由逗号分隔
3.花括号保存对象
4.方括号保存数组
具体语法实例请自行查询

3.C语言实现

C语言打包和解析JSON有相关库函数下载。
下载地址:https://sourceforge.net/projects/cjson/
核心文件:cJSON.h、cJSON.c
将cJSON.h、cJSON.c添加到工程中即可使用。
实例:

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"
#include "stdbool.h"

typedef int BOOL;
#define TRUE 1
#define FALSE 0
char* strJson;
char* MakeJson()//打包
{
    cJSON *temp = cJSON_CreateObject();
    if (temp == NULL)
    {
        //创建失败
        return FALSE;
    }
    //加入节点(键值对)
    cJSON_AddStringToObject(temp, "firstname", "Brett");
    cJSON_AddStringToObject(temp, "lastName", "McLaughlin");
    cJSON_AddNumberToObject(temp, "id", 1);
    cJSON * array = cJSON_CreateArray();
    if (array == NULL)
    {
        //创建失败
        return FALSE;
    }
    cJSON_AddItemToArray(array, temp);

    cJSON *root = cJSON_CreateObject();
    if (root == NULL)
    {
        //创建失败
        return FALSE;
    }
    cJSON_AddItemToObject(root, "programmers", array);

    strJson = cJSON_Print(root);
    cJSON_Delete(root);
}

BOOL ParseJson(const char* jsonStr)//解析
{


    cJSON* root = cJSON_Parse(jsonStr);

    BOOL ret = FALSE;

    if (root != NULL)
    {
        cJSON* programmersNode = cJSON_GetObjectItem(root, "programmers");
        if (programmersNode != NULL)
        {
            int iSize = cJSON_GetArraySize(programmersNode);
            if (iSize == 1)    //iSize 表示数组个数
            {
                cJSON* programmers[3] = {0};
                int i=0;
                for (i = 0; i < iSize ; ++i)
                {
                    programmers[i] = cJSON_GetArrayItem(programmersNode, i);
                    if (programmers[i] != NULL)
                    {
                        cJSON* firstName = cJSON_GetObjectItem(programmers[i], "firstName");
                        cJSON* lastName = cJSON_GetObjectItem(programmers[i], "lastName");
                        cJSON* id = cJSON_GetObjectItem(programmers[i], "id");
                        if (firstName != NULL && lastName != NULL && id != NULL)
                        {    
                            printf("id:%d\n",id->valueint);
                            printf("FirstName:%s\n",firstName->valuestring);
                            printf("lastName:%s\n",lastName->valuestring);
                        }
                        else
                        {
                            cJSON_Delete(root);
                            return FALSE;
                        }
                    }
                }
                ret = TRUE;
            }
        }
    }
    cJSON_Delete(root);
    return ret;
}

int main()
{
    MakeJson();
    if(strJson)printf("%s\n",strJson);                            //输出json
    else printf("MAKE NO\n");                                     //打包失败
    if(ParseJson(strJson)) printf("ParseJson OK\n"); //解析成功
    else printf("ParseJson NO\n");                             //解析失败
    free(strJson);
    return 0;
}

**注:上述代码可能存在一些内存泄露,正在完善
**

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cJSON是一个轻量级的JSON解析器和生成器,它可以在C语言使用。cJSON提供了一种方便的方式来解析和生成JSON数据,使得在C语言中处理JSON数据变得更加简单。以下是cJSON的一些常见用法。 ## 解析JSON数据 首先需要将JSON字符串转换成cJSON对象,然后根据需要获取对象的值。 ```c char* json_str = "{\"name\":\"Tom\",\"age\":20,\"gender\":\"male\"}"; cJSON* json = cJSON_Parse(json_str); if (json != NULL) { cJSON* name = cJSON_GetObjectItem(json, "name"); if (cJSON_IsString(name) && (name->valuestring != NULL)) { printf("name: %s\n", name->valuestring); } cJSON* age = cJSON_GetObjectItem(json, "age"); if (cJSON_IsNumber(age)) { printf("age: %d\n", age->valueint); } cJSON* gender = cJSON_GetObjectItem(json, "gender"); if (cJSON_IsString(gender) && (gender->valuestring != NULL)) { printf("gender: %s\n", gender->valuestring); } cJSON_Delete(json); } ``` 在上面的代码中,我们首先定义了一个JSON字符串,并使用`cJSON_Parse()`函数将其转换成cJSON对象。然后,我们使用`cJSON_GetObjectItem()`函数获取对象的值,该函数需要传入要获取的值的key。最后,我们使用`cJSON_IsString()`和`cJSON_IsNumber()`函数来检查获取到的值是否为字符串或数字类型。 ## 生成JSON数据 我们可以使用cJSON来生成JSON数据,并将其转换成JSON字符串。 ```c cJSON* json = cJSON_CreateObject(); if (json != NULL) { cJSON_AddStringToObject(json, "name", "Tom"); cJSON_AddNumberToObject(json, "age", 20); cJSON_AddStringToObject(json, "gender", "male"); char* json_str = cJSON_Print(json); printf("json_str: %s\n", json_str); free(json_str); cJSON_Delete(json); } ``` 在上面的代码中,我们首先使用`cJSON_CreateObject()`函数创建一个cJSON对象。然后,我们使用`cJSON_AddStringToObject()`和`cJSON_AddNumberToObject()`函数向对象中添加值。最后,我们使用`cJSON_Print()`函数将对象转换成JSON字符串,并使用`free()`函数释放内存。需要注意的是,在使用完cJSON对象后,需要使用`cJSON_Delete()`函数将其删除以释放内存。 ## 数组操作 cJSON还支持数组操作。 ```c cJSON* json = cJSON_CreateArray(); if (json != NULL) { cJSON* name1 = cJSON_CreateString("Tom"); cJSON_AddItemToArray(json, name1); cJSON* name2 = cJSON_CreateString("Mary"); cJSON_AddItemToArray(json, name2); char* json_str = cJSON_Print(json); printf("json_str: %s\n", json_str); free(json_str); cJSON_Delete(json); } ``` 在上面的代码中,我们首先使用`cJSON_CreateArray()`函数创建一个cJSON数组对象。然后,我们使用`cJSON_CreateString()`函数创建两个字符串对象,并使用`cJSON_AddItemToArray()`函数将它们添加到数组中。最后,我们使用`cJSON_Print()`函数将对象转换成JSON字符串,并使用`free()`函数释放内存。 以上是cJSON的一些常见用法,可以帮助我们在C语言中更加方便地处理JSON数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值