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;
}

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

C语言本身并不直接支持Unicode字符,包括汉字,因为C标准库提供的文件操作、字符串处理等函数都是基于ASCII字符集设计的。如果你想在C程序中输出汉字,通常需要借助一些外部库来处理UTF-8编码,如cJSON.c库可能会提供相应的字符串处理功能。 cJSON.c库主要用于解析和生成JSON数据,它的API可能不会直接提供输出Unicode字符的功能。但是你可以结合其他库,比如宽字符库wctype.h和wchar_t类型的使用,先将汉字转换为对应的UTF-8编码,然后再通过cJSON的输出接口输出。 例如: ```c #include <cJSON/cJSON.h> #include <stdio.h> #include <wchar.h> // 假设有一个函数可以将宽字符转为UTF-8字符串 char* utf8_from_wide(wchar_t wc) { // 实现宽字符到UTF-8的转换 } void output_hanzi(cJSON *root) { const char* json_str = cJSON_Print(root); if (json_str != NULL) { // 先将UTF-8字符串转为宽字符,然后输出 wchar_t* wide_str = utf8_to_wide(json_str); fputwc(wide_str, stdout); // 使用wprintf或者类似函数输出 free(json_str); // 不再需要JSON字符串,记得释放内存 free(wide_str); // 也释放宽字符转换后的内存 } else { printf("Error converting JSON to wide characters.\n"); } } int main() { cJSON *root = ...; // 初始化并填充JSON根节点 output_hansi(root); cJSON_Delete(root); return 0; } ``` 请注意,上述示例仅是一个基本思路,实际实现中可能需要处理错误情况,并确保宽字符库和UTF-8转换库已正确链接和配置。此外,cJSON库的cJSON_Print可能并未直接支持输出宽字符,你需要自行编写或找到相应的工具来完成这一转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值