cJSON:封装与解析(二)

2023-12-07 10:38
文章标签 封装 解析 cjson

本文主要是介绍cJSON:封装与解析(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

该篇介绍使用 cJSON 封装和解析数组。cJSON的简单使用请看这篇。

测试字符串:

{"name":	"children info","info":	[{"name":	"lilei","age":	5,"height":	0.45}, {"name":	"lily","age":	4,"height":	0.35}, {"name":	"hanmeimei","age":	4,"height":	0.4}]
}

1. 封装

enum json_print_formate
{PRINT_FORMATE = 0,    /*按 json 格式输出*/PRINT_UNFORMATE,      /*以字符串形式输出*/
};char *json_array_package(enum json_print_formate flag)
{cJSON *root = NULL; cJSON *info = NULL;cJSON *child_info = NULL;char *out = NULL;root = cJSON_CreateObject(); /*创建 json 根节点*/cJSON_AddStringToObject(root, "name", "children info");  /*添加字符串*/info = cJSON_CreateArray(); /*创建 json 数组*/cJSON_AddItemToObject(root, "info", info);    /*将数组加入到根节点*/child_info = cJSON_CreateObject();    /*向数组中添加成员*/cJSON_AddItemToArray(info, child_info);cJSON_AddStringToObject(child_info, "name", "lilei");  /*添加字符串*/cJSON_AddNumberToObject(child_info, "age", 5);      /*添加整型*/cJSON_AddNumberToObject(child_info, "height", 0.45);  /*添加浮点型*/child_info = cJSON_CreateObject();    /*向数组中添加成员*/cJSON_AddItemToArray(info, child_info);cJSON_AddStringToObject(child_info, "name", "lily");  /*添加字符串*/cJSON_AddNumberToObject(child_info, "age", 4);      /*添加整型*/cJSON_AddNumberToObject(child_info, "height", 0.35);  /*添加浮点型*/child_info = cJSON_CreateObject();    /*向数组中添加成员*/cJSON_AddItemToArray(info, child_info);cJSON_AddStringToObject(child_info, "name", "hanmeimei");  /*添加字符串*/cJSON_AddNumberToObject(child_info, "age", 4);      /*添加整型*/cJSON_AddNumberToObject(child_info, "height", 0.40);  /*添加浮点型*/if(PRINT_FORMATE == flag){out = cJSON_Print(root);   }else{out = cJSON_PrintUnformatted(root);    /*将json形式打印成正常字符串形式*/}/*释放内存*/  cJSON_Delete(root);     return out;  
}

2. 解析

void json_array_parse(char *json_string)
{cJSON *root = NULL;    /*json 根节点*/cJSON *name = NULL;cJSON *jarray = NULL;    /*json 数组*/cJSON *member = NULL;cJSON *age = NULL;cJSON *height = NULL;root = cJSON_Parse(json_string);name = cJSON_GetObjectItem( root , "name" );printf("root name:%s\n", name->valuestring);jarray = cJSON_GetObjectItem(root, "info");cJSON_ArrayForEach(member, jarray)    /*遍历数组*/{name = cJSON_GetObjectItem( member , "name" );age = cJSON_GetObjectItem( member , "age" );height = cJSON_GetObjectItem( member , "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_array_package(PRINT_FORMATE);printf("array formate:\n%s\n", json_str);json_array_parse(json_str);cJSON_free(json_str);json_str = json_array_package(PRINT_UNFORMATE);printf("\narray unformate:\n%s\n", json_str);json_array_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. 结果

array formate:
{"name":	"children info","info":	[{"name":	"lilei","age":	5,"height":	0.45}, {"name":	"lily","age":	4,"height":	0.35}, {"name":	"hanmeimei","age":	4,"height":	0.4}]
}
root name:children info
name:lilei, age:5, height:0.450000
name:lily, age:4, height:0.350000
name:hanmeimei, age:4, height:0.400000array unformate:
{"name":"children info","info":[{"name":"lilei","age":5,"height":0.45},{"name":"lily","age":4,"height":0.35},{"name":"hanmeimei","age":4,"height":0.4}]}
root name:children info
name:lilei, age:5, height:0.450000
name:lily, age:4, height:0.350000
name:hanmeimei, age:4, height:0.400000

Note:

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

上一篇

这篇关于cJSON:封装与解析(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/465545

相关文章

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

利用Python和C++解析gltf文件的示例详解

《利用Python和C++解析gltf文件的示例详解》gltf,全称是GLTransmissionFormat,是一种开放的3D文件格式,Python和C++是两个非常强大的工具,下面我们就来看看如何... 目录什么是gltf文件选择语言的原因安装必要的库解析gltf文件的步骤1. 读取gltf文件2. 提

Java中的runnable 和 callable 区别解析

《Java中的runnable和callable区别解析》Runnable接口用于定义不需要返回结果的任务,而Callable接口可以返回结果并抛出异常,通常与Future结合使用,Runnab... 目录1. Runnable接口1.1 Runnable的定义1.2 Runnable的特点1.3 使用Ru

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

使用EasyExcel实现简单的Excel表格解析操作

《使用EasyExcel实现简单的Excel表格解析操作》:本文主要介绍如何使用EasyExcel完成简单的表格解析操作,同时实现了大量数据情况下数据的分次批量入库,并记录每条数据入库的状态,感兴... 目录前言固定模板及表数据格式的解析实现Excel模板内容对应的实体类实现AnalysisEventLis

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操