基于cJSON库学习解析JSON数据格式

目录

1.cJSON结构体

2.cJSON常用API

(1)创建和释放JSON对象或数组

(2)在JSON对象中添加键值对

(3)在JSON数组中添加元素

(4) 获取JSON对象中的值

(5)获取JSON数组中的元素

(6)解析JSON字符串和生成JSON字符串

3.测试代码


 

        JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成,它是JavaScript编程语言的一个子集,但采用完全独立于语言的文本格式,C、Python、C++、Java、PHP、Go等编程语言都支持 JSON。

cJSON库函数下载地址

git clone https://github.com/DaveGamble/cJSON        

1.cJSON结构体

        在下载的cJSON库中,cJSON.h中定义了一个非常重要的cJSON结构体,cJSON用cJSON结构体来表示一个json数据,cJSON结构体结构体如下:

typedef struct cJSON
{
    /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
     struct cJSON *next;
     struct cJSON *prev;
    /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
     struct cJSON *child;
 
     /* The type of the item, as above. */
     int type; 
     /* The item's string, if type==cJSON_String  and type == cJSON_Raw */
     char *valuestring;
     /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
     int valueint;
     /* The item's number, if type==cJSON_Number */
     double valuedouble;

     /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
     char *string;
} cJSON;

        cJSON的设计很巧妙,它不是将一整段JSON数据抽象出来,而是将其中的一条JSON数据抽象出来,也就是一个键值对,用上面的结构体来表示,其中用来存放值的成员列表如下:

cJSON数据库是一个双向链表,next指向下一个节点、prev指向上一个节点,child指向子节点。

type:节点类型值,有如下七种类型:

#define cJSON_False 0

#define cJSON_Ture 1

#define cJSON_NULL 2

#define cJSON_Number 3

#define cJSON_Srting 4

#define cJSON_Array 5

#define cJSON_Obeject 6

valuestring:如果该键值(type)类型是字符串,则该指针指向键值

valueint:如果该键值(type)类型是整数,则该指针指向键值

valuedouble:如果该键值(type)类型是浮点数,则该指针指向键值

2.cJSON常用API

(1)创建和释放JSON对象或数组

cJSON *cJSON_CreateObject();
//创建一个json对象,返回一个cJSON结构体类型的指针。
cJSON *cJSON_CreateArray();
//创建一个数组对象,返回一个cJSON结构体类型的指针。
cJSON *cJSON_CreateString(const char *string);
//创建一个字符串对象,传入一个char *类型的字符串,返回一个cJSON结构体类型的指针。
void cJSON_Delete(cJSON *item);
//释放json对象或数组

(2)在JSON对象中添加键值对

void cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
//向json对象中添加一对元素,object为json对象,string为加入一对元素中的name,item为加入一对元素中的value。

(3)在JSON数组中添加元素

void cJSON_AddItemToArray(cJSON *array, cJSON *item);
//;=将一个元素添加到JSON数组中。

(4) 获取JSON对象中的值

cJSON *cJSON_GetObjectItem(const cJSON *object, const char *string);
//获取JSON对象中指定键的值。

(5)获取JSON数组中的元素

cJSON *cJSON_GetArrayItem(const cJSON *array, int index);
//获取JSON数组中指定索引的元素。

(6)解析JSON字符串和生成JSON字符串

cJSON *cJSON_Parse(const char *value);
//将JSON字符串解析为JSON对象。
char *cJSON_Print(const cJSON *item);
//将JSON对象转换为格式化的JSON字符串。

3.测试代码

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

int main() {
    // 创建JSON对象和数组
    cJSON *root = cJSON_CreateObject();
    cJSON *array = cJSON_CreateArray();

    // 向JSON对象中添加键值对
    cJSON_AddItemToObject(root, "name", cJSON_CreateString("John"));
    cJSON_AddItemToObject(root, "age", cJSON_CreateNumber(25));

    // 向JSON数组中添加元素
    cJSON_AddItemToArray(array, cJSON_CreateString("Apple"));
    cJSON_AddItemToArray(array, cJSON_CreateString("Banana"));
    cJSON_AddItemToArray(array, cJSON_CreateString("Orange"));

    // 将JSON数组添加到JSON对象中
    cJSON_AddItemToObject(root, "fruits", array);

    // 将JSON对象转换为字符串并打印
    char *jsonStr = cJSON_Print(root);
    printf("Generated JSON string:\n%s\n", jsonStr);

    // 释放JSON对象和字符串
    cJSON_Delete(root);
    free(jsonStr);

    // 解析JSON字符串
    const char *json = "{\"name\":\"Alice\",\"age\":30,\"fruits\":[\"Mango\",\"Grapes\"]}";
    cJSON *parsedJson = cJSON_Parse(json);

    // 从JSON对象中获取键值对的值
    cJSON *nameItem = cJSON_GetObjectItem(parsedJson, "name");
    cJSON *ageItem = cJSON_GetObjectItem(parsedJson, "age");

    if (nameItem && nameItem->valuestring && ageItem && ageItem->valueint) {
        printf("\nParsed JSON:\n");
        printf("Name: %s\n", nameItem->valuestring);
        printf("Age: %d\n", ageItem->valueint);

        // 从JSON数组中获取元素
        cJSON *fruitsArray = cJSON_GetObjectItem(parsedJson, "fruits");
        if (fruitsArray && cJSON_IsArray(fruitsArray)) {
            printf("Fruits: ");
            cJSON *fruitItem;
            cJSON_ArrayForEach(fruitItem, fruitsArray) {
                if (fruitItem && fruitItem->valuestring) {
                    printf("%s ", fruitItem->valuestring);
                }
            }
            printf("\n");
        }
    }

    // 释放解析后的JSON对象
    cJSON_Delete(parsedJson);

    return 0;
}

426569bc31a54c78a18566851f35ae7e.png

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
使用cjson解析一个json文件可以分为以下几步: 1. 引入cjson的头文件,如:`#include "cJSON.h"` 2. 读取json文件内容到一个字符串变量中,如: ``` char* json_content = NULL; FILE* fp = fopen("example.json", "rb"); fseek(fp, 0, SEEK_END); long file_size = ftell(fp); rewind(fp); json_content = (char*)malloc(file_size + 1); fread(json_content, file_size, 1, fp); fclose(fp); json_content[file_size] = '\0'; ``` 3. 使用cJSON的`cJSON_Parse()`函数解析json字符串,如: ``` cJSON* root = cJSON_Parse(json_content); if (root == NULL) { printf("Error before: [%s]\n", cJSON_GetErrorPtr()); } ``` 4. 通过`cJSON_GetObjectItem()`函数获取json对象的成员变量,如: ``` cJSON* name = cJSON_GetObjectItem(root, "name"); const char* name_value = name->valuestring; ``` 5. 释放cJSON对象的内存,如: ``` cJSON_Delete(root); ``` 完整的代码示例可以参考以下代码: ``` #include "cJSON.h" #include <stdio.h> #include <stdlib.h> int main() { char* json_content = NULL; FILE* fp = fopen("example.json", "rb"); fseek(fp, 0, SEEK_END); long file_size = ftell(fp); rewind(fp); json_content = (char*)malloc(file_size + 1); fread(json_content, file_size, 1, fp); fclose(fp); json_content[file_size] = '\0'; cJSON* root = cJSON_Parse(json_content); if (root == NULL) { printf("Error before: [%s]\n", cJSON_GetErrorPtr()); return 1; } cJSON* name = cJSON_GetObjectItem(root, "name"); const char* name_value = name->valuestring; printf("name: %s\n", name_value); cJSON_Delete(root); free(json_content); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弗朗克21

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值