cJSON介绍与应用—基于VS以及STM32单片机

一、cJSON介绍
cJSON是一个使用C语言编写的JSON数据解析器,具有超轻便,可移植,单文件的特点,使用MIT开源协议。
cJSON的源码文件只有两个:
1. cJSON.h
2. cJSON.c

使用的时候,只需要将这两个文件复制到工程目录,然后包含头文件cJSON.h即可
具体的介绍请看(https://blog.csdn.net/Mculover666/article/details/103796256),此博客对JSON与cJSON的介绍很详细,我的文章主要进行应用。
二、基于VS的应用
将cJSON.h与 cJSON.c添加到工程文件中,实现构建数据结构以及解析数据的功能,对于cJSON的应用,主要是使用cJSON构建自己的数据结构体,然后使用cJSON来进行解析到自己的数据,因此需要有两个函数:

/*********************************
@Function :创建数据结构
*********************************/
char* cJSON_Create_data(void)
/*********************************
@Function :解析数据
*********************************/
void Get_cJSON_data(char *message)

1、创建数据结构,将自己的数据构建数据结构,进行发送或存储

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

2、解析创建的数据结构,得到接收的数据

name: mculover666
age:22
number:300
weight:55.5
address-country:China
address-zipcode:111111
skill:[C,Java,Python]
student: false

3、应用工程
这个基于VS2012的工程可以直接下载使用,下载链接如下:
https://download.csdn.net/download/liujunping11/32672969
二、基于STM32的应用
基于STM32对于cJSON数据格式的应用有两种方式,一种是将cJSON.h与 cJSON.c添加到STM32的工程中,另一种是使用STM32自己的JSON库进行应用,以下回介绍两种方式。
STM32的cJSON的应用主要基于STM32将传感器检测到的数据发送到串口,然后设计上位机来解析串口的数据来进行演示,达到数据通信的应用形式。
1、将cJSON.h与 cJSON.c添加到STM32的工程
将cJSON.h与 cJSON.c添加到STM32的工程,跟上面类似,在STM32的工程里使用构建数据结构函数来构建发送的数据格式,在上位机中使用解析数据函数来解析数据结构得到自己接收的数据,具体如下:

  • 1.1

    STM32函数部分:构建数据结构,即{ “Lsens”:Data_cJSON(传感器数据)}

/*********************************
@Function :创建数据格式
*********************************/
char* cJSON_Create_data(u8 Data_cJSON)
{
    cJSON* cjson_test = NULL;
	
    char* str = NULL;

    /* 创建一个JSON数据对象(链表头结点) */
    cjson_test = cJSON_CreateObject();
   
	 /* 添加一条整数类型的JSON数据(添加一个链表节点) */
    cJSON_AddNumberToObject(cjson_test, "Lsens", Data_cJSON);

    /* 打印JSON对象(整条链表)的所有数据 */
    str = cJSON_Print(cjson_test);
    free(str);
    cJSON_Delete(cjson_test);
	return str;
}
  • 1.2
    上位机函数部分:上位机我使用QT写了一个串口小工具,使用数据解析函数来解析在STM32中构建的数据结构得到传感器数据,继而在QT的串口小工具中显示STM32数据,即解析{ “Lsens”:Data_cJSON(传感器数据)}中的Data_cJSON
/*********************************
@Function :解析数据格式
*********************************/
int Get_cJSON_data(char *message)
{
    cJSON* cjson_test = NULL;
    cJSON* cjson_Lsens = NULL;
    int data = 0;
    /* 解析整段JSO数据 */
    cjson_test = cJSON_Parse(message);
    if(cjson_test == NULL)
    {
        printf("parse fail.\n");
    }
    /* 依次根据名称提取JSON数据(键值对) */
    cjson_Lsens = cJSON_GetObjectItem(cjson_test, "Lsens");
    printf("Lsens:%d\n", cjson_Lsens->valueint);
    data = cjson_Lsens->valueint;
    return data;
}
  • 1.3
    上位机串口接收到的部分:如下图所示,其中{ “Lsens”:13}、{ “Lsens”:11}为STM32发送的数据结构,13、11为Qt解析的数据值。
    cJSON介绍与应用—基于VS以及STM32单片机_第1张图片

2、使用keil提供的JSON库——Jansson
(在工程中添加STM32的JSON库方法见https://blog.csdn.net/yannanxiu/article/details/52712723)
在main.c中添加#include ,keil的JSON库构建数据结构函数与cJSON不同,如下:

void jansson_pack_test(void)
{
    json_t *root;
    char *out;
    char buffer[4] = {'t', 'e', 's', 't'};
    /* Build an empty JSON object */
    root = json_pack("{}");
 
    out = json_dumps(root, JSON_ENCODE_ANY);
    printf("out:%s\r\n", out);
    free(root);
    free(out);
 
    /* Build the JSON object {"foo": 42, "bar": 7} */
    root = json_pack("{sisi}", "foo", 42, "bar", 7);
 
    out = json_dumps(root, JSON_ENCODE_ANY);
    printf("out:%s\r\n", out);
    free(root);
    free(out);
 
    /* Like above, ':', ',' and whitespace are ignored */
    root = json_pack("{s:i, s:i}", "foo", 42, "bar", 7);
 
    out = json_dumps(root, JSON_ENCODE_ANY);
    printf("out:%s\r\n", out);
    free(root);
    free(out);
 
    /* Build the JSON array [[1, 2], {"cool": true}] */
    root = json_pack("[[i,i],{s:b}]", 1, 2, "cool", 1);
 
    out = json_dumps(root, JSON_ENCODE_ANY);
    printf("out:%s\r\n", out);
    free(root);
    free(out);
 
    /* Build a string from a non-null terminated buffer */
    
    root = json_pack("[s#]", buffer, 4);
 
    out = json_dumps(root, JSON_ENCODE_ANY);
    printf("out:%s\r\n", out);
    free(root);
    free(out);
 
    /* Concatenate strings together to build the JSON string "foobarbaz" */
    root = json_pack("[s++]", "foo", "bar", "baz");
 
    out = json_dumps(root, JSON_ENCODE_ANY);
    printf("out:%s\r\n", out);
    free(root);
    free(out);
}

在自己实际应用时,根据自己需要来构建数据结构

  • 2.1
    STM32函数部分:构建{ “Lsens”:Data_cJSON(传感器数据)}
/*********************************
@Function :使用keil的json库创建数据格式
*********************************/
void jansson_test(u8 Data_cJSON)
{
    json_t *root;
    char *out;
		/* Like above, ':', ',' and whitespace are ignored */
		root = json_pack("{si}", "Lsens", Data_cJSON);
		out = json_dumps(root, JSON_ENCODE_ANY);
		printf("%s\r\n", out);
		free(out);   
        json_delete(root);  //先free,再json_delete组合最好,内存才能释放
}
  • 2.2
    上位机函数部分:解析{ “Lsens”:Data_cJSON(传感器数据)}中的Data_cJSON,Qt解析部分不变,效果如下
    cJSON介绍与应用—基于VS以及STM32单片机_第2张图片
    3、应用工程
    STM32工程以及Qt部分下载链接如下:
    基于STM32的cJSON应用
    https://download.csdn.net/download/liujunping11/33143631
    基于Qt上位机解析cJSON的串口小工具
    https://download.csdn.net/download/liujunping11/33143700

你可能感兴趣的:(stm32,单片机,数据结构,json,qt)