C/C++ 中 JSON 库的使用 (CJSON/nlohmann)
C/C++ 中 JSON 库的使用 (CJSON/nlohmann)
- 概述
- cjson
- 基本操作
- 从(字符指针)缓冲区中解析出JSON结构
- 转成成JS字符串(将传入的JSON结构转化为字符串)
- 将JSON结构所占用的数据空间释放
- JSON 值的创建
- 创建一个值类型的数据
- 创建一个对象(文档)
- 数组创建以及添加
- JSON嵌套
- 向对象中增加键值对
- 向数组中增加对象
- 几个能提高操作效率的宏函数
- 查找JSON值
- 根据键找json结点
- 判断是否有key是string的项
- 返回数组结点array中成员的个数
- 根据数组下标index取array数组结点的第index个成员
- 遍历数组
- nlohmann
- nlohmann库使用代码示例
概述
纯C环境中使用
cjson
库,C++环境中也可以使用nlohmann
库,本文介绍基本的使用场景,如需更详细的介绍可以查看库官方文档。
nlohmann:
nlohmann库(https://github.com/nlohmann/json)提供了丰富而且符合直觉的接口(https://json.nlohmann.me/api/basic_json/),只需导入头文件即可使用,方便整合到项目中。
CJSON:
JSON: JavaScript Object Notation(JavaScript 对象表示法),是轻量级的存储和交换文本信息的语法,类似 XML . 特点是纯文本(纯字符串)、层级结构、使用数组。
cJson:一个基于 C 语言的 Json 库,它是一个开源项目,github 下载地址:https://github.com/DaveGamble/cJSON
cJson库组成:主要的文件有两个,一个 cJSON.c 一个 cJSON.h。使用时,将头文件 include 进去即可
cjson
typedef struct cJSON { //cJSON结构体struct cJSON*next,*prev; /* 遍历数组或对象链的前向或后向链表指针*/struct cJSON *child; /*数组或对象的孩子节点*/int type; /* key的类型*/char *valuestring; /*字符串值*/int valueint; /* 整数值*/double valuedouble; /* 浮点数值*/char *string; /* key的名字*/
} cJSON_st;
-
基本操作
-
从(字符指针)缓冲区中解析出JSON结构
extern cJSON *cJSON_Parse(const char *value); //解析一块JSON数据返回cJSON结构, 在使用完之后调用cJSON_Delete函数释放json对象结构。
解析JSON数据包,并按照cJSON结构体的结构序列化整个数据包。
使用该函数会通过malloc函数在内存中开辟一个空间,使用完成需要手动释放。
extern char *cJSON_Print(cJSON *item); //可用于输出到输出设备, 使用完之后free(char *) cJSON_PrintUnformatted(cJSON *item); //类似,没有格式,即转换出的字符串中间不会有"\n" "\t"之类的东西存在.
void cJSON_Delete(cJSON *c) //会将其下的所有节点的资源一并释放掉!!
-
JSON 值的创建
-
创建一个值类型的数据
extern cJSON *cJSON_CreateNumber(double num);//创建 extern cJSON *cJSON_CreateString(const char *string); //创建 extern cJSON *cJSON_CreateArray(void); //创建json数组
extern cJSON *cJSON_CreateObject(void); //创建一个根数据项,之后便可向该根数据项中添加string或int等内容
cJSON *cJSON_CreateIntArray(const int *numbers,int count);void cJSON_AddItemToArray(cJSON *array, cJSON *item);
-
JSON嵌套
-
向对象中增加键值对
cJSON_AddItemToObject(root, "rows", 值类型数据相关函数());
- 向对象中增加数组
cJSON_AddItemToObject(root, "rows", cJSON_CreateArray()); //创建一个根数据项,之后便可向该根数据项中添加string或int等内容
cJSON_AddItemToArray(rows, cJSON_CreateObject()); //向json数组中增加元素/对象
#define cJSON_AddNumberToObject(object,name,n) cJSON_AddItemToObject(object, name,cJSON_CreateNumber(n))
//向json对象中添加数字,节点名and节点值#define cJSON_AddStringToObject(object,name,s) cJSON_AddItemToObject(object, name, cJSON_CreateString(s))
// 向json对象中添加字符串
-
查找JSON值
-
根据键找json结点
extern cJSON *cJSON_GetObjectItem(cJSON *object,const char*string) //从cJSON结构体中查找某个子节点名称(键名称),如果查找成功可把该子节点序列化到cJSON结构体中。
extern int cJSON_HasObjectItem(cJSON *object,const char *string){ return cJSON_GetObjectItem(object,string)?1:0; } //如果有返回1 否则返回0
extern int cJSON_GetArraySize(cJSON *array);
extern cJSON *cJSON_GetArrayItem(cJSON *array,int index); //返回该成员节点
#define cJSON_ArrayForEach(pos, head) for(pos = (head)->child; pos != NULL; pos = pos->next) cJSON_ReplaceItemInObject(json,"data",cJSON_CreateString("hello")) //用于代替json对象中data元组的值
nlohmann
使用方式比较简单,下面直接通过示例来说明.
nlohmann库使用代码示例
#pragma once#include <iostream> #include <fstream> #include <string> #include <nlohmann/json.hpp>static bool JsonConfigInit(const std::string& config_file)bool ret = false;std::ifstream cfg_file(config_file);if (!cfg_file.is_open()) {nlohmann::json configjson; //创建一个空结构configjson["config_settings"] = { {"bool_value", true},{"file_size", 15},{"info_file", "./tmp.ini"}};//对对象进行初始化std::ofstream(config_file.c_str()) << configjson;std::cout << "create config json file"<< std::endl;return false;}try{std::cout << "JsonConfigInit from \" " << config_file<< "\" "<< std::endl;const nlohmann::json& file_json = nlohmann::json::parse(cfg_file);//判断首节点是否存在if(file_json.is_null() || (file_json.contains("config_settings") == false ) || file_json.at("config_settings").size() == 0){ret = false; goto json_end;}nlohmann::json set_json = file_json.at("config_settings"); // 获取相应的键值对,get_to必须保证双方类型一致,否则极易出现段错误bool m_json_bool;int m_json_number;std::string m_json_string ;if(set_json.at("bool_value").is_boolean()){set_json.at("bool_value").get_to(m_json_bool);}if(set_json.at("file_size").is_number()){set_json.at("file_size").get_to(m_json_number);}if(set_json.at("info_file").is_string()){set_json.at("info_file").get_to(m_json_string);}ret = true;}}catch (nlohmann::json::parse_error& ex){ std::cerr << "JsonConfigInit failed:parse error ! ! reason: [" << ex.what() << "]"<< std::endl;}catch (nlohmann::json::exception& ex){std::cerr << "JsonConfigInit parse_json parse fail! reason: [" << ex.what() << "]"<< std::endl;}json_end: cfg_file.close();return ret;}
相关文章:
C/C++ 中 JSON 库的使用 (CJSON/nlohmann)
C/C 中 JSON 库的使用 (CJSON/nlohmann)概述cjson基本操作从(字符指针)缓冲区中解析出JSON结构转成成JS字符串(将传入的JSON结构转化为字符串)将JSON结构所占用的数据空间释放JSON 值的创建创建一个值类型的数据创建一个对象(文档)…...

【Opencv项目实战】目标检测:自动检测出现的所有动态目标
文章目录一、项目思路二、算法详解2.1、计算两个数组或数组与标量之间的每个元素的绝对差。2.2、轮廓检测 绘制物体轮廓 绘制矩阵轮廓2.3、连续窗口显示2.4、读取视频,显示视频,保存视频三、项目实战:实时动态目标检测实时动态目标检测一、…...

活动报名:Tapdata Cloud V3 最新功能全解与核心应用场景演示
作为中国的 “Fivetran/Airbyte”, Tapdata Cloud 自初版公测以来,已累积10,000 注册用户。核心场景包括 Any Source → Any Target 的实时数据库同步、数据入湖入仓,以及通用 ETL 处理等。近期,功能特性全面优化的 Tapdata Cloud V3 也已开放…...

人工智能AI威武,爱也……恨也……
人工智能AI威武,爱也!恨也!!它会创作会代码,从它那儿能仿到更好的思维;多它那里可以学到更好的代码。它聪慧全能,成为一坨人偷懒神器;变成“智者”作弊的“倚天屠龙”!&a…...

SpringBoot-基础篇
SpringBoot基础篇 在基础篇中,我给学习者的定位是先上手,能够使用SpringBoot搭建基于SpringBoot的web项目开发,所以内容设置较少,主要包含如下内容: SpringBoot快速入门SpringBoot基础配置基于SpringBoot整合SSMP…...

Tapdata Connector 实用指南:实时数仓场景之数据实时同步至 ClickHouse
【前言】作为中国的 “Fivetran/Airbyte”, Tapdata 是一个以低延迟数据移动为核心优势构建的现代数据平台,内置 60 数据连接器,拥有稳定的实时采集和传输能力、秒级响应的数据实时计算能力、稳定易用的数据实时服务能力,以及低代码可视化操作…...

刷题专练之数组移除元素
文章目录前言一、移除元素1.题目介绍2.思路:3.代码二、移动零1.题目介绍2.思路3.代码三、删除有序数组中的重复项1.题目介绍2.思想3.代码四、80. 删除有序数组中的重复项 II1.题目介绍2.思路3.代码4.推荐题解前言 我每个刷题篇的题目顺序都是特别安排的,…...

常见激活函数Activation Function的选择
Activation Function激活函数一般会神经网络中隐层和输出层上,其中作用在输出层主要用于适配输出,比如sigmoid函数可用于生成[0,1]之间的概率估计值。而作用于隐层主要用于增加神经网络的非线性,增加了网络的表达能力,本文主要介绍…...

大厂跟进ChatGPT,为什么百度“文心一言”成色最好?【快评】
作者 | 曾响铃 文 | 响铃说 赶ChatGPT热度,百度3月初就要发布与ChatGPT类似的人工智能聊天机器人服务“文心一言”(英文名:ERNIE Bot),似乎无法提振资本市场对百度的信心。 2022年第四季度及全年未经审计的财报发布…...

ChatGPT和Web3:人工智能如何帮助您建立和发展您的 Web3 公司
ChatGPT是OpenAI在2022年11月推出的聊天机器人。该机器人建立在OpenAI的GPT-3人工智能家族上,并通过监督学习和强化学习技术进行了优化。 与ChatGPT机器人聊天时,你会感觉自己在与一个懂得一切并以非常教育性的方式回答的朋友交谈。回答在许多知识领域非…...
【人工智能 AI】怎样实施RPA 机器人流程自动化(Robotic Process Automation)?核心技术有哪些?
文章目录 RPA 简介RPA的实施RPA的核心技术1. 自动化测试(1)自动化测试工具(2)自动化测试框架2. 自动化脚本(1)自动化脚本语言(2)自动化脚本框架3. 机器学习(1)机器学习模型(2)机器学习框架(3)自然语言处理(4)图像处理(5)深度学习(6)机器人操作系统RPA核心能…...

基于BP神经网络的性别识别,BP神经网络详细原理,自编码神经网络代码,神经网络案例之18
目标 背影 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 数据 神经网络参数 基于BP神经网络 性别识别的MATLAB代码 效果图 结果分析 展望 背影 男人体内蛋白质比例大,女生…...

2023年消费电子行业研究报告
第一章 行业概况 消费电子行业是电子信息行业的子行业。消费电子是指围绕着消费者应用而设计的与生活、工作和娱乐息息相关的电子类产品,通常会应用于娱乐、通讯以及文书用途,最终实现消费者自由选择资讯、享受娱乐的目的,主要侧重于个人购买…...
CSDN 编程竞赛三十一期题解
竞赛总览 CSDN 编程竞赛三十一期:比赛详情 (csdn.net) 本次竞赛的最后一道题的描述部分有些问题(题目描述与样例不符),另外,测试数据似乎也有点问题,试了多种方式,但最多只能通过10%的测试点。…...

SpringMVC常见面试题(2023最新)
目录前言1.简单介绍下你对springMVC的理解?2.说一说SpringMVC的重要组件及其作用3.SpringMVC的工作原理或流程4.SpringMVC的优点5.SpringMVC常用注解6.SpringMVC和struts2的区别7.怎么实现SpringMVC拦截器8.SpringMvc的控制器是不是单例模式?如果是,有什…...

【正点原子FPGA连载】第十六章DP彩条显示实验 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南
1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第十六章DP彩条显…...

数据结构与算法—链表list
目录 链表 链表类型 链表插入 链表删除 写程序注意点 与数组区别 链表应用 LRU 实现思想 链表 链表,一种提高数据读取性能的技术,在硬件设计、软件开发中有广泛应用。常见CPU缓存,数据库缓存,浏览器缓存等。缓存满时&#…...

自定义View练习题目整理
一、动态音频播放柱形图 1、效果图: 2、步骤 (1)、新建自定义View类,继承View (2)、重写onDraw()方法,使用画笔和画布循环画一定数量的柱形 Overrideprotected void onDraw(Canvas canvas) {s…...

LAMP平台部署及应用
LAMP平台部署及应用 📒博客主页: 微笑的段嘉许博客主页 💻微信公众号:微笑的段嘉许 🎉欢迎关注🔎点赞👍收藏⭐留言📝 📌本文由微笑的段嘉许原创! Ὄ…...
ubuntu20.04安装python3虚拟环境
1.安装pip3 sudo apt install python3-pip2.安装虚拟环境 sudo apt install virtualenv sudo apt install virtualenvwrapper3.修改配置文件设置环境变量 打开.bashrc并编辑 gedit ~/.bashrc在.bashrc文件后面加入下面两行 export WORKON_HOME$HOME/.virtualenvs source …...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...