CJSON入门(CJSON下载,基本使用)

目录

一、CJSON安装

1、安装(选择一种方式即可)

① 百度网盘安装连接

②GitHub连接

2、使用

二、JSON介绍

1、JSON简介

2、JSON数据组成

三、CJSON常用函数

1、 CSON对象的创建

2、创建一个新的JSON对象

3、cJSON_AddStringToObject()函数

4、创建一个CJSON数组

5、cJSON_AddItemToArray()

6、cJSON_AddItemToObject()

7、向指定键里添加bool值

8、cJSON_Print()

9、cJSON_Parse()

10、cJSON_GetObjectItem()

11、cJSON_GetArraySize()

12、cJSON_GetStringValue()

13、cJSON_GetNumberValue()

14、cJSON_GetArrayItem()

15、->valuestring

16、->valueint

四、CJSON小例子(重点)

1、使用CJSON组一个JSON字符串

2、解析JSON字符串并将其存放在结构体中并输出

一、CJSON安装

1、安装(选择一种方式即可)

① 百度网盘安装连接

链接: 百度网盘 请输入提取码

提取码: qp3j

②GitHub连接

GitHub - DaveGamble/cJSON: Ultralightweight JSON parser in ANSI C

2、使用

按照好了将.h文件拖入头文件.c文件拖入源文件,使用时包含头文件即可

二、JSON介绍

1、JSON简介

Json是一种轻量级的数据交换格式(也叫数据序列化方式)。Json采用完全独立于编程语言的文本格式 来存储和表示数据。简洁和清晰的层次结构使得 Json 成为理想的数据交换言。 易于人阅读和编 写,同时也易于机器解析和生成,并有效地提升网络传输效率。

2、JSON数据组成

JSON数据由键值对(key/value pairs)组成,其中键是字符串,值可以是字符串、数字、对象、数组、布尔值或null。JSON的数据结构主要包括以下几种类型:

  1. 对象(Object):用花括号{}表示,包含零个或多个键值对,每个键值对由键和值组成,键和值之间使用冒号:分隔,键值对之间使用逗号,分隔。

  2. 数组(Array):用方括号[]表示,包含零个或多个值,值之间使用逗号,分隔。

  3. 字符串(String):用双引号""或单引号''包裹的文本数据。

  4. 数字(Number):整数或浮点数。

  5. 布尔值(Boolean):表示真或假。

  6. 空值(null):表示空值。

三、CJSON常用函数

1、 CSON对象的创建

cJSON* person = NULL;//相当于一个指针,创建时先将其置空

2、创建一个新的JSON对象

cJSON *newObject = cJSON_CreateObject();

3、cJSON_AddStringToObject()函数

作用:将一个字符串类型的值添加到一个JSON对象中

/*
函数原型:
cJSON *cJSON_AddStringToObject(cJSON *object, const char *string, const char *value);
*/


//使用:
cJSON_AddStringToObject(newObject, "name", "John");

同类型常用函数原型:

//用于向JSON对象中添加一个数字类型的值
cJSON *cJSON_AddNumberToObject(cJSON *object, const char *string, double number);


//用于向JSON对象中添加一个新的键值对
void cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);

4、创建一个CJSON数组

创建一个空的JSON数组,并返回指向该数组的指针。

/*
函数原型;
cJSON *cJSON_CreateArray(void);

*/

//使用:
cJSON* newArray=cJSON_CreateArray();

5、cJSON_AddItemToArray()

这个函数用于将一个JSON值(item)添加到JSON数组(array)中。函数会返回指向添加的JSON值的指针。

cJSON *cJSON_AddItemToArray(cJSON *array, cJSON *item);

6、cJSON_AddItemToObject()

这个函数用于将一个JSON值(item)添加到一个JSON对象(object)中,key是string。这样就可以在对象中创建一个key-value对。

void cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);

7、向指定键里添加bool值

// This function adds a boolean true value to a JSON object with a specified key
void cJSON_AddTrueToObject(cJSON *object, const char *string);


// This function adds a boolean false value to a JSON object with a specified key
void cJSON_AddFalseToObject(cJSON *object, const char *string);

8、cJSON_Print()

cJSON_Print函数用于将cJSON对象转换为JSON格式的字符串,并返回该字符串的指针。

char* cJSON_Print(const cJSON *item);

9、cJSON_Parse()

cJSON_Parse函数是 cJSON 库中用于解析 JSON 字符串的函数。它接收一个 JSON 字符串作为输入,然后返回一个指向 cJSON 结构体的指针,该结构体表示了解析后的 JSON 数据。

cJSON* cJSON_Parse(const char *value);

value 参数是一个指向包含 JSON 数据的字符串的指针。调用该函数后,如果解析成功,将返回一个指向 cJSON 结构体的指针;如果解析失败,将返回 NULL。

10、cJSON_GetObjectItem()

用于获取 JSON 对象中指定键对应的值的函数。它接收一个 cJSON 对象和一个键的名称作为输入,然后返回该键对应的值。

cJSON* cJSON_GetObjectItem(const cJSON *object, const char *string);

其中,object 参数是一个指向 cJSON 对象的指针,表示要获取值的 JSON 对象;string 参数是一个指向包含键名称的字符串的指针,表示要获取的键的名称。调用该函数后,如果找到指定键的值,将返回一个指向 cJSON 结构体的指针,该结构体表示键对应的值;如果没有找到指定键,将返回 NULL。

例如,如果有一个 JSON 对象 jsonObject 包含键值对 "name": "John",我们可以使用 cJSON_GetObjectItem(jsonObject, "name") 来获取键 "name" 对应的值。

11、cJSON_GetArraySize()

用于获取 JSON 数组的大小(即包含的元素个数)的函数。它接收一个 cJSON 对象作为输入,并返回该数组中元素的数量。

int cJSON_GetArraySize(const cJSON *array);

其中,array 参数是一个指向 cJSON 对象的指针,表示要获取大小的 JSON 数组。调用该函数后,将返回表示数组大小的整数值,即数组中元素的数量。

例如,如果有一个 JSON 数组 jsonArray 包含三个元素,我们可以使用 cJSON_GetArraySize(jsonArray) 来获取该数组的大小,结果将会是 3。

12、cJSON_GetStringValue()

用于获取 JSON 字符串值的函数。它接收一个 cJSON 对象作为输入,并返回该对象中存储的字符串值。

const char *cJSON_GetStringValue(const cJSON *string);

13、cJSON_GetNumberValue()

获取 JSON 数值的函数。它接收一个 cJSON 对象作为输入,并返回该对象中存储的数值。

double cJSON_GetNumberValue(const cJSON *number);

14、cJSON_GetArrayItem()

用于获取 JSON 数组中特定索引位置的项的函数。它接受一个 cJSON 数组对象和一个索引作为输入,并返回该数组中指定索引位置的 cJSON 对象。

cJSON *cJSON_GetArrayItem(const cJSON *array, int index);

15、->valuestring

用于获取 JSON 对象中字符串值的函数

const char *value = cJSON_GetStringValue(json_object);

16、->valueint

获取 JSON 对象中的整数值

cJSON *json_object = cJSON_Parse("{\"key\": 123}");
cJSON *value = cJSON_GetObjectItem(json_object, "key");
int integer_value = value->valueint;

四、CJSON小例子(重点)

1、使用CJSON组一个JSON字符串

学习例子是最快上手的方法

创建了一个json对象person,里面含有字符串name,整型age,浮点型weight、还包含一个json对象address,以及一个布尔型student

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

int main()
{
    cJSON* cjson_person = NULL;
    cJSON* cjson_address = NULL;
    cJSON* cjson_skill = NULL;
    char* str = NULL;

    cjson_person = cJSON_CreateObject();  //创建一个JSON节点

    cJSON_AddStringToObject(cjson_person, "name", "Lily");  //往JSON节点里添加一对键值对(字符型):姓名

    cJSON_AddNumberToObject(cjson_person, "age", 22);//往JSON节点里添加一对键值对(整型):年龄

    cJSON_AddNumberToObject(cjson_person, "weight", 50.2);//往JSON节点里添加一对键值对(浮点型):体重

    cjson_address = cJSON_CreateObject();  //再创建一个JSON对象
    cJSON_AddStringToObject(cjson_address, "country", "China");
    cJSON_AddNumberToObject(cjson_address, "zip-code", 123456);
    cJSON_AddItemToObject(cjson_person, "address", cjson_address);//将JSON对象嵌套在JSON对象里

    cjson_skill = cJSON_CreateArray(); //创建一个JSON数组
    cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "C" )); //往JSON数组里添加数据
    cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "C++" ));
    cJSON_AddItemToArray(cjson_skill, cJSON_CreateString( "Python" ));
    cJSON_AddItemToObject(cjson_person, "skill", cjson_skill);//将JSON数组添加到JSON对象中

    cJSON_AddTrueToObject(cjson_person, "student");  //像JSON对象里添加一个布尔类型的数据

    str = cJSON_Print(cjson_person);  //将JSON数据打印
    printf("%s\n", str);

    return 0;
}

运行结果:

2、解析JSON字符串并将其存放在结构体中并输出

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

struct Address
{
    char *country;
    int zipCode;
};


struct Person
{
    char *name;
    int age;
    double weight;
    struct  Address adds;
    char *skill[3];
    bool isStudent;
};

struct Address;
struct Person;

int main(void)
{
    const char *str={"{\"name\": \"Lily\",\"age\":22,\"weight\":50.2,\"address\":{\"country\":\"China\",\"zip-code\":123456},\"skill\":[\"C\", \"C++\", \"Python\"],\"student\":true}"};
    cJSON *person=cJSON_Parse(str); //将字符串str解析成一个json数组
    int i;

    struct Person m_person;
    struct Address add;

    cJSON *name=cJSON_GetObjectItem(person,"name");//从json对象中解析出字符型对象name
    cJSON *age=cJSON_GetObjectItem(person,"age");//从json对象中解析出整型对象age
    cJSON *weight=cJSON_GetObjectItem(person,"weight");//从json对象中解析出浮点型对象weight

    cJSON *address=cJSON_GetObjectItem(person,"address");//从json对象中解析出json对象address
    cJSON *country=cJSON_GetObjectItem(address,"country");
    cJSON *zip=cJSON_GetObjectItem(address,"zip-code");

    cJSON *skill=cJSON_GetObjectItem(person,"skill");//从json对象中解析出json数组
    cJSON *skilln;
    cJSON *IsStudent=cJSON_GetObjectItem(person,"student");//从json对象中解析出布尔类型对象name
    int skill_size=cJSON_GetArraySize(skill);//获取json数组的元素个数

    m_person.name=(char*)cJSON_GetStringValue(name);//提取字符型json对象的值
    printf("name:%s\n",m_person.name);
    m_person.age=(int)cJSON_GetNumberValue(age);//提取整型json对象的值
    printf("age:%d\n",m_person.age);
    m_person.weight=cJSON_GetNumberValue(weight);//提取浮点型json对象的值
    printf("weight:%.2f\n",m_person.weight);

    add.country=cJSON_GetStringValue(country);
    add.zipCode=(int)cJSON_GetNumberValue(zip);
    m_person.adds=add;
    printf("country:%s,zip-code:%d\n",m_person.adds.country,m_person.adds.zipCode);

    for(i=0;i<skill_size;i++)//循环遍历json数组提取元素并将其循环打印
    {
        skilln=cJSON_GetArrayItem(skill,i);
        printf("skill%d:%s\n",i,skilln->valuestring);
        m_person.skill[i]=(char*)skilln->valuestring;
    }


    m_person.isStudent=(bool)IsStudent->valueint;//提取布尔型对象
    if(m_person.isStudent) printf("%s is a student!\n",m_person.name);
    else printf("%s is not a student!\n",m_person.name);

    return 0;
}

运行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值