最近由於需要兩個單片機之間的數據傳輸,所以瞭解到了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;
}
**注:上述代碼可能存在一些內存泄露,正在完善
**