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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章