json文件写操作-下文

接上文json文件写操作

2.4 控制函数长度代码规范版

#include <iostream>
#include <string>
#include "../3rd/cJSON/cJSON.h"
#include "../test_memset/include/ArrayToZero.h"using namespace std;void AddLikeObject(cJSON* interest, cJSON* final, cJSON* likeObject1, cJSON* likeObject2, cJSON* like)
{// 插入元素,对应 键值对cJSON_AddItemToObject(interest, "combat",cJSON_CreateString("热血"));        // 当值是字符串时,需要使用函数cJSON_CreateString()创建cJSON_AddItemToObject(interest, "reasoning", cJSON_CreateString("推理"));// 或者使用宏进行添加//cJSON_AddStringToObject(interest, "reasoning", "推理");    // 或者这样写// 2.定义 [ ] 数组// 往数组中添加元素cJSON_AddItemToArray(final, cJSON_CreateString("BE"));cJSON_AddItemToArray(final, cJSON_CreateString("HE"));// 3.定义 { } 对象cJSON_AddItemToObject(likeObject1, "game", cJSON_CreateString("斩赤红之瞳"));cJSON_AddItemToObject(likeObject1, "Episodes",cJSON_CreateNumber(22));        // 当值是数字时,需要使用函数cJSON_CreateNumber()创建//cJSON_AddNumberToObject(likeObject1, "price", 66.6);    // 或者这样写cJSON_AddItemToObject(likeObject2, "game", cJSON_CreateString("文豪野犬"));cJSON_AddItemToObject(likeObject2, "Episodes", cJSON_CreateNumber(84));// 4.定义 [ ] 数组// 往数组中添加元素cJSON_AddItemToArray(like, likeObject1);cJSON_AddItemToArray(like, likeObject2);
}void AddEducationObject(cJSON* education1, cJSON* education2, cJSON* education, cJSON* serialOne, cJSON* serialTwo, cJSON* languages)
{// 定义 [ ] 数组cJSON_AddItemToArray(education1, cJSON_CreateString("战斗"));cJSON_AddItemToArray(education1, cJSON_CreateString("热血"));cJSON_AddItemToArray(education2, cJSON_CreateString("推理"));cJSON_AddItemToArray(education2, cJSON_CreateString("格斗"));// 5.定义 [ ] 数组/*"languages": {"serialOne": { "language": "汉语", "grade" : 10 },"serialTwo" : { "language": "英语", "grade" : 6}}*/cJSON_AddItemToArray(education, education1);cJSON_AddItemToArray(education, education2);// 定义对象 { }cJSON_AddItemToObject(serialOne, "language", cJSON_CreateString("汉语"));cJSON_AddItemToObject(serialOne, "grade", cJSON_CreateNumber(10));cJSON_AddItemToObject(serialTwo, "language", cJSON_CreateString("英语"));cJSON_AddItemToObject(serialTwo, "grade", cJSON_CreateNumber(6));// 定义对象 { }cJSON_AddItemToObject(languages, "serialOne", serialOne);cJSON_AddItemToObject(languages, "serialTwo", serialTwo);
}void json_write()
{//1. 定义对象 { }cJSON* interest = cJSON_CreateObject();cJSON* final = cJSON_CreateArray();cJSON* likeObject1 = cJSON_CreateObject();cJSON* likeObject2 = cJSON_CreateObject();cJSON* like = cJSON_CreateArray();cJSON* education1 = cJSON_CreateArray();cJSON* education2 = cJSON_CreateArray();cJSON* education = cJSON_CreateArray();cJSON* serialOne = cJSON_CreateObject();cJSON* serialTwo = cJSON_CreateObject();cJSON* languages = cJSON_CreateObject();cJSON* root = cJSON_CreateObject();if (interest == nullptr || final == nullptr || likeObject1 == nullptr || likeObject2 == nullptr ||like == nullptr || education1 == nullptr || education2 == nullptr || education == nullptr ||serialOne == nullptr || serialTwo == nullptr || languages == nullptr || root == nullptr) {cJSON_Delete(interest);cJSON_Delete(final);cJSON_Delete(likeObject1);cJSON_Delete(likeObject2);cJSON_Delete(like);cJSON_Delete(education1);cJSON_Delete(education2);cJSON_Delete(education);cJSON_Delete(serialOne);cJSON_Delete(serialTwo);cJSON_Delete(languages);cJSON_Delete(root);return;}AddLikeObject(interest, final, likeObject1, likeObject2, like);AddEducationObject(education1, education2, education, serialOne, serialTwo, languages);// 将子项插入根项中cJSON_AddItemToObject(root, "name", cJSON_CreateString("Blue"));cJSON_AddItemToObject(root, "age", cJSON_CreateNumber(25));cJSON_AddItemToObject(root, "interest", interest);cJSON_AddItemToObject(root, "final", final);cJSON_AddItemToObject(root, "like", like);cJSON_AddItemToObject(root, "education", education);cJSON_AddItemToObject(root, "languages", languages);cJSON_AddItemToObject(root, "vip", cJSON_CreateTrue());    // "vip":    true        插入布尔类型数据需要使用cJSON_CreateBool函数cJSON_AddItemToObject(root, "address",cJSON_CreateNull());    // "address":    null    插入NULL值需要使用cJSON_CreateNull函数//cJSON_AddTrueToObject(root, "vip");//cJSON_AddNullToObject(root, "address");    // 或者这样写也是可以的// 控制台输出char* ALL_JSON = cJSON_Print(root);char* ALL_JSONUnformatted = cJSON_PrintUnformatted(root);
#ifdef TRACK_TESTprintf("ALL_JSON:\n%s\n", ALL_JSON);                          // ALL_JSON:有做格式调整printf("ALL_JSONUnformatted:\n%s\n", ALL_JSONUnformatted);    // cJSON_PrintUnformatted:没有做格式调整
#endif// 返回的字符串指针需要自己释放free(ALL_JSON);free(ALL_JSONUnformatted);//****************************************************************// 打开文件FILE* file = NULL;file = fopen("E:\\abs\\test.json", "w");if (file == NULL) {printf("Open file fail!\n");// 释放指针内存cJSON_Delete(root);return;}char* cjValue = cJSON_Print(root);// 写入文件//int ret = fwrite(cjValue, sizeof(char), strlen(cjValue), file);int ret = fputs(cjValue, file);if (ret == EOF) {printf("写入文件失败!\n");}fclose(file);free(cjValue);// 释放指针内存cJSON_Delete(root);
}int main()
{cout << "test CJSON" << "hello" << endl;ArrayToZero arrayToZero;arrayToZero.showArray();json_write();return 0;
}

2.6 CMakelist.txt

cmake_minimum_required(VERSION 3.16.5)message("this is cmakelist log")
message(${CMAKE_CURRENT_SOURCE_DIR})get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)
message(${ProjectId})
message(${ProjectId})
message(NAME)
string(REPLACE " " "_" ProjectId ${ProjectId})
message(${ProjectId})#project(${ProjectId} CXX)
project(${ProjectId})SET(CMAKE_CXX_COMPILER "g++")
SET(CMAKE_C_COMPILER "gcc")#添加宏定义Debug为CMAKE_BUILD_TYPE
SET(CMAKE_BUILD_TYPE "Release")
SET(CMAKE_BUILD_TYPE "Debug")
SET(PLATFORM "LINUX")add_definitions(-DCLUSTER_DEBUG)
add_definitions(-DCOMBINE_WEEKDAY)set(CMAKE_CXX_STANDARD 17)if (CMAKE_BUILD_TYPE STREQUAL Debug)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -D_DEBUG")
else ()set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_FORTIFY_SOURCE=2 -O3 -DNDEBUG -s")
endif ()if (PLATFORM STREQUAL WINDOWS OR PLATFORM STREQUAL windows)SET(PLATFORM windows)add_definitions(-DWIN32)
else ()SET(PLATFORM linux)add_definitions(-Dlinux)
endif()add_definitions(-DTRACK_TEST
)#添加头文件
#例如:include_directories(/usr/include/abc /usr/include/xxx)
#是将“/usr/include/abc”和“/usr/include/xxx”这两个目录添加至编译器的头文件搜索目录(两个目录用空格分隔)include_directories(../3rd/cJSON)
include_directories(../test_memset/include/)
#通过编译源文件来创建一个可执行文件,其中,name是生成的可执行文件的名称,source是创建可执行文件所需要的源文件。
#源文件可以使用aux_source_directory指令返回的变量(将源文件保存在这个变量中),也可以是指定的.cpp文件(注意路径)。
aux_source_directory(../3rd/cJSON cJSONSrc)
aux_source_directory(../test_memset/src memsetSrc)add_executable(${ProjectId}${memsetSrc}${cJSONSrc}main.cpp)

2.5 关于指针释放

其中需要注意的是,增加下面的语句会出现报错。原因是这里只调用cJSON_Delete(root)就可以了,zeroError,zeroErrorIntersection,finalTime,relatively都挂在了root下面。

//    cJSON_Delete(zeroError);
//    cJSON_Delete(zeroErrorIntersection);
//    cJSON_Delete(finalTime);
//    cJSON_Delete(relatively);

2.6 关于external"C"

然后上述代码,如果删除掉下面的代码好像也不影响,不知道为什么。

#ifdef __cplusplus
extern "C" {
#endif   

然后我就在想是不是因为我引用的某个文件已经加了这个定义,然后整个工程就有了这个定义。我在cJSON.h文件中确实发现了上面c++的定义,我现在尝试注释掉这个宏定义,然后再次编译,确实报错了。

所以我现在突然理解了,就是想调用c文件,或者应该这样说,这个c文件想被其他文件调用,就应该在头文件中定义extren “C”,这样其他c++文件就可以正常调用这个c文件。OK!

2.7 验证指针挂载

下面验证cJSON_AddItemToArray(education, education1);这个语句是否是将education1指针挂在在education上,

写测试代码

cJSON_Delete(education1);
cJSON_Delete(education2);
cJSON_Delete(education);

运行程序提示free(): double free detected in tcache 2,所以确实是将education1挂在education上了。只需要释放一次,跟上述root一样处理。

三、错误处理

/usr/bin/ld: CMakeFiles/testCJSON.dir/main.cpp.o: in function `json_write()':
/data2/z30031397/myProjTest/test_CJSON/main.cpp:15: undefined reference to `cJSON_CreateObject'
/usr/bin/ld: /data2/z30031397/myProjTest/test_CJSON/main.cpp:17: undefined reference to `cJSON_CreateString'
/usr/bin/ld: /data2/z30031397/myProjTest/test_CJSON/main.cpp:17: undefined reference to `cJSON_AddItemToObject'
/usr/bin/ld: /data2/z30031397/myProjTest/test_CJSON/main.cpp:18: undefined reference to `cJSON_CreateString'
/usr/bin/ld: /data2/z30031397/myProjTest/test_CJSON/main.cpp:18: undefined reference to `cJSON_AddItemToObject'
/usr/bin/ld: /data2/z30031397/myProjTest/test_CJSON/main.cpp:23: undefined reference to `cJSON_CreateArray'
/usr/bin/ld: /data2/z30031397/myProjTest/test_CJSON/main.cpp:25: undefined reference to `cJSON_CreateString'
/usr/bin/ld: /data2/z30031397/myProjTest/test_CJSON/main.cpp:25: undefined reference to `cJSON_AddItemToArray'
/usr/bin/ld: /data2/z30031397/myProjTest/test_CJSON/main.cpp:26: undefined reference to `cJSON_CreateString'
/usr/bin/ld: /data2/z30031397/myProjTest/test_CJSON/main.cpp:26: undefined reference to `cJSON_AddItemToArray'
/usr/bin/ld: /data2/z30031397/myProjTest/test_CJSON/main.cpp:30: undefined reference to `cJSON_CreateObject'
/usr/bin/ld: /data2/z30031397/myProjTest/test_CJSON/main.cpp:31: undefined reference to `cJSON_CreateString'
/usr/bin/ld: /data2/z30031397/myProjTest/test_CJSON/main.cpp:31: undefined reference to `cJSON_AddItemToObject'
/usr/bin/ld: /data2/z30031397/myProjTest/test_CJSON/main.cpp:32: undefined reference to `cJSON_CreateNumber'
/usr/bin/ld: /data2/z30031397/myProjTest/test_CJSON/main.cpp:32: undefined reference to `cJSON_AddItemToObject'
/usr/bin/ld: /data2/z30031397/myProjTest/test_CJSON/main.cpp:35: undefined reference to `cJSON_CreateObject'
/usr/bin/ld: /data2/z30031397/myProjTest/test_CJSON/main.cpp:36: undefined reference to `cJSON_CreateString'

这边这个问题还堵住了好几天,然后今天再搞一下,发现是因为cpp调用c文件的原因,将Cmakelist.txt文件的CXX删掉就可以了。下次注意这个啦。如果在cmakelist.txt文件中写成了CXX,那么应该是工程定义成C++工程,引用.c文件就会有问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/14448.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【NumPy】关于numpy.reshape()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

实时检测GPU使用率nvidia-smi

nvidia-smi --query-gpuutilization.gpu --formatcsv,noheader,nounits 为了判断所有 GPU 的利用率都小于阈值&#xff0c;可以循环检查每一个 GPU 的利用率。如果所有 GPU 的利用率都低于阈值&#xff0c;则增加空闲时间计数&#xff1b;否则&#xff0c;重置空闲时间计数。 …

python文件名通常以什么结尾

python文件后缀一般有两个&#xff0c;分别是.py和.pyw。视窗用 python.exe 运行 .py&#xff0c;用 pythonw.exe 运行 .pyw 。 这纯粹是因为安装视窗版Python时&#xff0c;扩展名 .py 自动被登记为用 python.exe 运行的文件&#xff0c;而 .pyw 则被登记为用 pythonw.exe 运…

信息系统项目管理师--八大绩效域-度量绩效域

信息系统工程师的八大绩效域包括&#xff1a;干系人、团队、开发方法和生命周期、规划、项目工作、交付、度量、不确定性。 度量绩效域涉及评估项目绩效和采取应对措施相关的活动和职能。 预期目标 对项目状况充分理解数据充分、可支持决策及时采取行动&#xff0c;确保项目最…

[程序员] 最近的感悟,错误处理占大头?

根据昨天分享的一个问题&#xff0c;想到的。 在代码里&#xff0c;异常处理的代码也算是占大头&#xff0c;扑面而来的就是发生错误时怎么处理的大片代码&#xff1b;而且出现问题的概率是绝对的占大头。所以&#xff0c;异常代码出现bug的概率也在不知不觉中增加&#xff01…

linux中使用yum下载对应软件包的离线安装包

方案一&#xff08;推荐&#xff09;&#xff1a;repotrack #安装yum-utils yum -y install yum-utils #下载 ansible 全量依赖包 -p 指定下载目录 -a 指定版本 repotrack -a x86_64 -p /tmp ansible 方法二&#xff1a;yumdownloader yumdownloader 命令在软件包 yum-utils…

LeetCode刷题之HOT100之汉明距离

大家晚上好啊&#xff0c;今天几乎啥也没干&#xff0c;上个课就耽误了一下午&#xff0c;晚上来了积极性也不高&#xff0c;先完成今天的题目吧&#xff0c;请看题&#xff1a; 1、题目描述 2、逻辑分析 没有遇到过这种题目&#xff0c;想不出来有什么解法&#xff0c;看题解…

【尚品汇】开发过程记录

Mybatis-Plus返回自增的主键Id OverrideTransactional(rollbackFor Exception.class)public void saveBaseAttrInfo(BaseAttrInfo baseAttrInfo) {//1&#xff0c;平台属性信息 判断是修改还是添加if(baseAttrInfo.getId() ! null){baseAttrInfoMapper.updateById(baseAttrInf…

跟TED演讲学英文:Do schools kill creativity by Sir Ken Robinson

Do schools kill creativity? Link: https://www.ted.com/talks/sir_ken_robinson_do_schools_kill_creativity Speaker: Sir Ken Robinson Date: February 2006 文章目录 Do schools kill creativity?IntroductionVocabularySummaryTranscriptAfterword Introduction Sir…

可转债日内自动T+0交易,行情推送+策略触发+交易接口

说明 目前这个项目已编译打包,下载即可测试,直接生成多平台可执行文件&#xff0c;详见运行方法。行情部分与策略弱相关&#xff0c;拆分解耦单独作为一个项目。行情项目请移步GitHub - freevolunteer/hangqing: A股行情订阅工具&#xff0c;支持股票/可转债level2/level2数据&…

【stm32/CubeMX、HAL库】嵌入式实验六:定时器(3)|外部脉冲计数

参考&#xff1a; 【【正点原子】手把手教你学STM32CubeIDE开发】 https://www.bilibili.com/video/BV1Wp42127Cx/?p13&share_sourcecopy_web&vd_source9332b8fc5ea8d349a54c3989f6189fd3 《嵌入式系统基础与实践》刘黎明等编著&#xff0c;第九章定时器&#xff0c…

ubuntu root密码遗忘的修改办法

在Ubuntu中&#xff0c;如果你需要进入恢复模式&#xff08;Recovery Mode&#xff09;来修改用户密码&#xff0c;可以按照以下步骤进行&#xff1a; 重启计算机&#xff1a; 重新启动你的Ubuntu系统&#xff0c;等待GRUB菜单出现。 进入恢复模式&#xff1a; 如果GRUB菜单没…

Generic Segmentation Offload(GSO)

Generic Segmentation Offload汉语意思是啥&#xff1f; Generic Segmentation Offload&#xff08;GSO&#xff09;的汉语意思是“通用分段卸载”。在网络通信中&#xff0c;GSO 是一种技术&#xff0c;用于在网络栈中将较大的传输单元分段为更小的单元&#xff0c;以提高网络…

docker安装常用软件

1、potainer docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock \-v /mnt/opt/data/docker/portainer:/data \--restartalways --name portainer portainer/portainer-ce:latest 2、cloudreve docker run -d \ --name cloudreve \ -p 5212:5212 \ -…

文心智能体应用示例:职场反PUA专家的诞生

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

C#编程-.NET Framework使用工具类简化对象之间的属性复制和操作

在C#编程中&#xff0c;对象之间的属性复制和操作是一个常见的需求。为此&#xff0c;.NET Framework提供了多种实用工具库&#xff0c;如AutoMapper、ValueInjecter和ExpressMapper。这些库通过简化代码&#xff0c;提高了开发效率。本文将介绍这些工具库&#xff0c;比较它们…

远程桌面连接不上远程服务器,如何有效的解决远程桌面连接不上远程服务器的问题

在解决远程桌面连接不上远程服务器的问题时&#xff0c;我们需要采取一种专业且系统的方法来排查和修复可能存在的故障。以下是一些建议和步骤&#xff0c;帮助用户更有效地解决此类问题。 首先&#xff0c;用户需要确认远程服务器的状态和网络连接是否正常。 这包括检查服务器…

Linux入门攻坚——23、DNS和BIND基础入门2

前一篇实践了正向解析服务器的配置使用&#xff0c;如何配置反向解析呢&#xff1f; 反向区域&#xff1a; 区域名称&#xff1a;网络地址反写.in-addr.arpa. 192.168.138. --> 138.168.192.in-addr.arpa. (1)定义区域&#xff1a; zone "ZONE_NAME" I…

必应bing国内广告如何开户,这篇文章告诉你!

搜索引擎广告推广已成为企业提升品牌知名度、吸引潜在客户的重要渠道&#xff0c;微软必应Bing&#xff0c;作为全球领先的搜索引擎之一&#xff0c;其广告平台为企业提供了一个高效、精准的推广渠道。如何在必应Bing国内广告平台上开户&#xff0c;让你的品牌大放异彩呢&#…

一流的人才,不如二流的执行力

别总天天问什么赛道好做 说句实话&#xff0c;有的人&#xff0c;你给他再好的赛道也没用&#xff0c;做不起来还是做不起来有的人随便做一个赛道都能成功