cJSON:封装与解析(一)

知识共享许可协议 版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons

JSON:JavaScript Object Notation,一种数据交互格式。

cJSON:C 语言实现,用于封装和解析 json 数据。

cJSON开源地址:https://github.com/DaveGamble/cJSON

1. 封装

enum json_print_formate
{
    JSON_OUT_FORMATE = 0,    /*按 json 格式输出*/
    JSON_OUT_UNFORMATE,      /*以字符串形式输出*/
};

char *json_package(enum json_print_formate flag)
{
    cJSON *root = NULL;   
    char *out = NULL;

    root =cJSON_CreateObject();   /*根*/
    cJSON_AddStringToObject(root, "name", "sdc");  /*添加字符串*/
    cJSON_AddNumberToObject(root, "age", 24);      /*添加整型*/
    cJSON_AddNumberToObject(root, "height", 1.78);  /*添加浮点型*/

    if(JSON_OUT_FORMATE == flag)
    {
        out = cJSON_Print(root);   
    }
    else
    {
        out = cJSON_PrintUnformatted(root);/*将json形式打印成正常字符串形式*/
    }

    /*释放内存*/  
    cJSON_Delete(root);     

    return out;
}

2. 解析

void json_parse(char *json_string)
{
    cJSON *root = NULL;
    cJSON *name = NULL;
    cJSON *age = NULL;
    cJSON *height = NULL;
    
    root = cJSON_Parse(json_string); /*解析成json形式*/
    name = cJSON_GetObjectItem(root, "name");  /*获取键值内容*/
    age = cJSON_GetObjectItem(root, "age");
    height = cJSON_GetObjectItem(root, "height");

    printf("name:%s,age:%d,height:%f\n", name->valuestring, age->valueint, height->valuedouble);
 
    /*释放内存*/
    cJSON_Delete(root);  
}

3. 测试

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

int main()
{
    char *json_str = NULL;

    json_str = json_package(JSON_OUT_FORMATE);
    printf("formate:\n%s\n", json_str);
    json_parse(json_str);
    cJSON_free(json_str);

    json_str = json_package(JSON_OUT_UNFORMATE);
    printf("unformate:%s\n", json_str);
    json_parse(json_str);
    cJSON_free(json_str);
}

   CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

project(json_test)

include_directories(./)

aux_source_directory(./ SRC_FILES)

add_executable(${PROJECT_NAME} ${SRC_FILES})

4. 结果

formate:
{
	"name":	"sdc",
	"age":	24,
	"height":	1.78
}
name:sdc,age:24,height:1.780000
unformate:{"name":"sdc","age":24,"height":1.78}
name:sdc,age:24,height:1.780000

Note:

cJSON_Print(const cJSON *item) 和 cJSON_PrintUnformatted(const cJSON *item) 这两个函数会调用 malloc 分配内存,需要调用 cJSON_free(void *object) 进行释放。                                                                                                                                                                         

猜你喜欢

转载自blog.csdn.net/shizhe0123/article/details/94742514