stm32实现json格式传输/ cjson使用

cjson是一个开源的C文件,可以实现用C语言生成json格式数据,

步骤1:准备工作

在keil里添加cjson.c和cjson.h,cjson文件下载,使用微云,不要积分

main.c里引用cjson.h

#include <I:\cjson\test_cjson\cJSON.h>

步骤2:cjson函数简单讲解

首先需要创建一个cjson的指针,用于存储数据,

cJSON *cjson_head=NULL;

然后使用添加函数,添加数字和字符要使用不同的函数,

#添加字符
cJSON_AddStringToObject(cjson_head, "name", "mculover666");
#添加数字
cJSON_AddNumberToObject(cjson_head,"age",22);

完成后,想使用json时,因为是一个指针,无法直接使用,需要用一个字符串接收格式化后的json格式

char *str=NULL;
str = cJSON_Print(cjson_head);
printf("%s\n", str);

此时,直接使用str即可,通过串口输出或者通过4G发送,MQTT发送等等。
更复杂的,json格式可以嵌套,这会在步骤3里展示。

步骤3:一个例子, 生成json格式数据

#include <I:\cjson\test_cjson\cJSON.h>
#include <stdio.h>

#创建cjson的指针,用于存储数据,可以创建多个
cJSON *cjson_head=NULL;
cJSON *cjson_address=NULL;
cJSON *cjson_skill=NULL;
char *str=NULL;



int main()
{
    cjson_head=cJSON_CreateObject();
    // add string to cjson
    cJSON_AddStringToObject(cjson_head, "name", "mculover666");

    //add number to cjson
    cJSON_AddNumberToObject(cjson_head,"age",22);

    //add float to cjson
    cJSON_AddNumberToObject(cjson_head, "weight", 55.5);

        /* 添加一个嵌套的JSON数据(添加一个链表节点) */
    cjson_address = cJSON_CreateObject();
    cJSON_AddStringToObject(cjson_address, "country", "China");
    cJSON_AddNumberToObject(cjson_address, "zip-code", 111111);
    cJSON_AddItemToObject(cjson_head, "address", cjson_address);

    /* 添加一个数组类型的JSON数据(添加一个链表节点) */
    cjson_skill = cJSON_CreateArray();
    cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "C" ));
    cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "Java" ));
    cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "Python" ));
    cJSON_AddItemToObject(cjson_head, "skill", cjson_skill);

    /* 添加一个值为 False 的布尔类型的JSON数据(添加一个链表节点) */
    cJSON_AddFalseToObject(cjson_head, "student");

    /* 打印JSON对象(整条链表)的所有数据 */
    str = cJSON_Print(cjson_head);
    printf("%s\n", str);

    return 0;

}

运行结果为

{
        "name": "mculover666",
        "age":  22,
        "weight":       55.5,
        "address":      {
                "country":      "China",
                "zip-code":     111111
        },
        "skill":        ["C", "Java", "Python"],
        "student":      false
}

如果有帮到你,请点个赞。

8.14更新

很多人反馈打印出来有乱码,有多种可能,
第一步:首先排除波特率和串口问题,确认硬件没问题后进行下一步
第二步:先尝试一个小的json数组能否正常运行,例如:

{
        "name": "mculover666"
}

确认代码是否正常执行,
这是因为STM32 的内存资源有限,特别是在堆内存分配上。在使用 cJSON 库时需要确保有足够的内存来存储 JSON 数据。如果内存不足,可能会导致分配失败,从而导致乱码或崩溃。
第三步:检查堆栈大小,如果你的json数组很大,会占用很多内存,参考评论区意见,需要增加STM32的堆栈大小,可以搜索一下,这里不再教如何调整堆栈大小了。

  • 25
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
引用\[1\]中提到了在STM32使用cJSON库来处理json格式的数据。cJSON是一个轻量级的C语言库,用于生成和解析json数据。在STM32中,可以使用cJSON库来生成和解析json对象。 在引用\[2\]中,给出了cJSON对象的类型定义,包括了Invalid、False、True、NULL、Number、String、Array、Object和Raw等类型。可以根据需要选择合适的类型来创建json对象。 在引用\[2\]中的示例中,展示了如何生成一个json对象,并添加键值对。首先创建一个根对象pJsonRoot,然后创建一个子对象pJsonItem,并使用cJSON_AddStringToObject函数向pJsonItem中添加键值对。最后使用cJSON_AddItemToObject函数将pJsonItem添加到pJsonRoot中。最后使用cJSON_PrintUnformatted函数将pJsonRoot格式化为字符串,并打印出来。 在引用\[3\]中的示例中,展示了如何解析json数据。首先使用cJSON_Parse函数将json字符串解析为一个cJSON对象pJsonParseItem\[0\]。然后使用cJSON_GetObjectItem函数获取pJsonParseItem\[0\]中的子对象pJsonParseItem\[1\],并使用cJSON_GetObjectItem函数获取pJsonParseItem\[1\]中的键值对。最后使用strcasecmp函数比较键值对的值,并进行相应的处理。 以上是关于在STM32使用cJSON库处理json格式的简要介绍。 #### 引用[.reference_title] - *1* [stm32实现json格式传输/ cjson使用](https://blog.csdn.net/weixin_47485810/article/details/127568345)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [STM32实用应用系列:Json数据格式 与 cJSON使用](https://blog.csdn.net/laifengyuan1/article/details/111031333)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值