最近由于需要两个单片机之间的数据传输,所以了解到了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;
}
**注:上述代码可能存在一些内存泄露,正在完善
**