cJSON介绍及使用demo

JSON简介

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。
JSON的两种结构:

  • “名称/值”对的集合(A collection of name/value pairs)。
  • 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

一个在线的JSON校验网址https://www.bbejson.com

JSON的形式

  • 对象是一个无序的名称/值对集合。一个对象以 {(左括号)开始,}(右括号)结束。每个“名称”后跟一个:(冒号),在名称/值对之间使用 ,逗号 分隔。
  • 数组是值(value)的有序集合。一个数组以 [(左中括号)开始, ](右中括号)结束。值之间使用 ,(逗号)分割。
  • 值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。
  • 字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。
  • 数值(number)也与C或者Java的数值非常相似。除去未曾使用的八进制与十六进制格式。除去一些编码细节。
  • 空白可以加入到任何符号之间。

JSON示例

# demo1
{
 "name": "Susan",
 "age": 27,
 "birthday": {
  "year": 1984,
  "month": 2,
  "day": 11
 }
}

# demo2
{
    "name": "Integrated Camera",
    "vid": 5075,
    "pid": 22041,
    "format": [{
            "type": "video/x-raw",
            "width": 640,
            "height": 480,
            "fps": 30
        },
        {
            "type": "video/x-raw",
            "width": 960,
            "height": 540,
            "fps": 15
        },
        {
            "type": "video/x-raw",
            "width": 1280,
            "height": 720,
            "fps": 10
        },
        {
            "type": "image/jpeg",
            "width": 640,
            "height": 480,
            "fps": 30
        },
        {
            "type": "image/jpeg",
            "width": 960,
            "height": 540,
            "fps": 30
        },
        {
            "type": "image/jpeg",
            "width": 1280,
            "height": 720,
            "fps": 30
        }
    ]
}

cJSON

简介

cJSON是一个超轻巧,携带方便,单文件,简单的可以作为ANSI-C标准的JSON解析器。使用时,只需要包含cJSON.h和cJSON.c两个文件即可。

使用示例

#include "cJSON.h"
#include <stdio.h>
#include <stdlib.h>

/*
创建一个json对象
{
    "number": "00001",
    "name":"zhang san",
    "class":"140412"
}
*/
void test01()
{
    cJSON* pRoot = cJSON_CreateObject(); //创建一个对象
    if (!pRoot)
        return;

    cJSON_AddStringToObject(pRoot, "number", "00001"); //添加一个节点
    cJSON_AddStringToObject(pRoot, "name", "zhang san");
    cJSON_AddStringToObject(pRoot, "class", "140412");
    char* szJson = cJSON_Print(pRoot);

    if (szJson != NULL)
    {
        printf("%s\n", szJson);
        free(szJson);
    }

    cJSON_Delete(pRoot);
}

/*
创建一个数组
[1,2,3,4]
*/
void test02()
{
    cJSON* pRoot = cJSON_CreateArray(); //创建一个数组
    if (!pRoot)
        return;
    for (int i = 1; i < 5; i++)
        cJSON_AddNumberToObject(pRoot, "cls", i);
    char* szJson = cJSON_Print(pRoot);

    if (!szJson)
        return;
    printf("%s\n", szJson);

    free(szJson);
    cJSON_Delete(pRoot);

}

/*
数组的成员为对象
[
   {"number": "00001", "name":"zhang3"},
   {"number": "00002", "name":"li4"},
   {"number": "00003", "name":"wang5"},
   {"number": "00004", "name":"zhao6"}
]
*/
void test03()
{
    cJSON* pRoot = cJSON_CreateArray();
    if (!pRoot)
        return;
    char* szNumArray[] = {"0001", "0002", "0003", "0004"};
    char* szNameArray[] = {"zhang3", "li4", "wang5", "zhao6"};
    for (int i = 0; i < __crt_countof(szNumArray); i++)
    {
        cJSON* pItem = cJSON_CreateObject(); //子结构体
        cJSON_AddStringToObject(pItem, "number", szNumArray[i]);
        cJSON_AddStringToObject(pItem, "name", szNameArray[i]);
        cJSON_AddItemToObject(pRoot, "", pItem);
    }

    char* szJson = cJSON_Print(pRoot);
    if (!szJson)
        return;
    printf("%s\n", szJson);

    free(szJson);
    cJSON_Delete(pRoot);
}

/*
{
    "class" : "10000",
    "student": [
        {
            "number":"0001",
            "name": "zhang3"
        }, 
        {
            "number":"0002",
            "name": "li4"
        }, 
        {
                "number": "0003",
                "name": "wang5"
        }, 
        {
                "number": "0004",
                "name": "zhao6"
        }
    ]
}
*/
void test04()
{
    cJSON* pRoot = cJSON_CreateObject();
    if (!pRoot)
        return;
    cJSON_AddStringToObject(pRoot, "class", "10000");
    cJSON* pSubRoot = cJSON_CreateArray();
    if (!pSubRoot)
    {
        cJSON_Delete(pRoot);
        return;
    }

    char* szNumArray[] = { "0001", "0002", "0003", "0004" };
    char* szNameArray[] = { "zhang3", "li4", "wang5", "zhao6" };
    for (int i = 0; i < __crt_countof(szNumArray); i++)
    {
        cJSON* pItem = cJSON_CreateObject(); //子结构体
        cJSON_AddStringToObject(pItem, "number", szNumArray[i]);
        cJSON_AddStringToObject(pItem, "name", szNameArray[i]);
        cJSON_AddItemToArray(pSubRoot, pItem);
    }
    cJSON_AddItemToObject(pRoot, "student", pSubRoot);

    char* szJson = cJSON_Print(pRoot);
    if (!szJson)
        return;
    printf("%s\n", szJson);

    free(szJson);
    cJSON_Delete(pRoot);
}

/*
解析json
*/
cJSON* create()
{
    cJSON* pRoot = cJSON_CreateObject();
    if (!pRoot)
        return NULL;
    cJSON_AddStringToObject(pRoot, "class", "10000");
    cJSON* pSubRoot = cJSON_CreateArray();
    if (!pSubRoot)
    {
        cJSON_Delete(pRoot);
        return NULL;
    }

    char* szNumArray[] = { "0001", "0002", "0003", "0004" };
    char* szNameArray[] = { "zhang3", "li4", "wang5", "zhao6" };
    for (int i = 0; i < __crt_countof(szNumArray); i++)
    {
        cJSON* pItem = cJSON_CreateObject(); //子结构体
        cJSON_AddStringToObject(pItem, "number", szNumArray[i]);
        cJSON_AddStringToObject(pItem, "name", szNameArray[i]);
        cJSON_AddItemToArray(pSubRoot, pItem);
    }
    cJSON_AddItemToObject(pRoot, "student", pSubRoot);

    char* szJson = cJSON_Print(pRoot);
    if (!szJson)
        return NULL;
    printf("%s\n", szJson);

    return pRoot;
}

void parse(cJSON* root)
{
    if (!root)
        return;
    cJSON* pClass = cJSON_GetObjectItem(root, "class"); //获取对象
    printf("class = %s\n", pClass->valuestring);
    cJSON* pArray = cJSON_GetObjectItem(root, "student"); 
    int nCount = cJSON_GetArraySize(pArray);
    for (int i = 0; i < nCount; i++)
    {
        cJSON* pStudent = cJSON_GetArrayItem(pArray, i);
        cJSON* pNum = cJSON_GetObjectItem(pStudent, "number");
        cJSON* pName = cJSON_GetObjectItem(pStudent, "name");
        printf("number=%s, name=%s\n", pNum->valuestring, pName->valuestring);
    }
}

void test05()
{
    cJSON* p = create();
    parse(p);
    cJSON_Delete(p);
}

int main()
{
    test05();

    return 0;
}

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值