C/C++ json库
文章目录
- 一、介绍
- 1.1 json 介绍
- 二、C/C++ json 库选型
- 2.1 选型范围
- 2.2 jsoncpp
- 2.2.2 jsoncpp 编译和交叉编译
- 2.3 rapidjson
- 2.4 nlohmann/json
- 2.5 sonic-cpp
- 五、常见问题
- 5.1 jsoncpp 中关于浮点数的控制和中文显示问题
- 5.2 jsoncpp序列化double类型时精度损失问题的解决办法
一、介绍
1.1 json 介绍
- 官网:http://www.json.org/json-zh.html
- JSON是什么?如何正确理解?
二、C/C++ json 库选型
2.1 选型范围
- 资料
- 官网:http://www.json.org/json-zh.html
- 开源库比较:https://github.com/miloyip/nativejson-benchmark
- C++中json库的选择
- C/C++ 开源 JSON 程序库性能及标准符合程度评测
- 开源库
- Rapidjson、Rapidjson_FullPrec、Rapidjson_AutoUTF
- nlohmann / json
- jsoncpp
- 结论:
- 注重最佳性能,选 Rapidjson (cereal序列化库使用)
- 注重易用性,选 jsoncpp (ros 使用)、nlohmann / json
2.2 jsoncpp
- 精度控制:precision
- 15,16,17:原值会变
- 0-14:原值不变的情况下,四舍五入
2.2.2 jsoncpp 编译和交叉编译
-
jsoncpp 的编译和交叉编译
-
编译
mkdir build; cd build cmake -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS=ON \ -DCMAKE_INSTALL_PREFIX=`pwd`/result \ -DJSONCPP_WITH_TESTS=OFF \ .. make install -j4
-
交叉编译
mkdir build; cd build cmake -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS=ON \ -DCMAKE_INSTALL_PREFIX=`pwd`/result \ -DJSONCPP_WITH_TESTS=OFF \ .. -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake \ .. make install -j4# toolchain.cmake 定义交叉编译环境变量 SET(CMAKE_SYSROOT "/opt/fslc-x11/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi") set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) set(TOOLS /opt/fslc-x11/2.4.4/sysroots/x86_64-fslcsdk-linux/usr/bin/arm-fslc-linux-gnueabi) set(CMAKE_C_COMPILER "${TOOLS}/arm-fslc-linux-gnueabi-gcc") set(CMAKE_CXX_COMPILER "${TOOLS}/arm-fslc-linux-gnueabi-g++") set(CMAKE_AR "${TOOLS}/arm-fslc-linux-gnueabi-ar")
-
include/json
-
lib/cmake/xxx.cmake
-
lib/pkgconfig/jsoncpp.pc
-
pkgconfig
mayue@PC-MAYUE:/mnt/d/hik/opensource/jsoncpp-1.9.5/build/result/lib$ cat pkgconfig/jsoncpp.pc prefix=/mnt/d/hik/opensource/jsoncpp-1.9.5/build/result exec_prefix=/mnt/d/hik/opensource/jsoncpp-1.9.5/build/result libdir=${exec_prefix}/lib includedir=${prefix}/includeName: jsoncpp Description: A C++ library for interacting with JSON Version: 1.9.5 URL: https://github.com/open-source-parsers/jsoncpp Libs: -L${libdir} -ljsoncpp Cflags: -I${includedir}
指定连接静态库
g++ jsoncpp-test.cpp -I./include -L ./lib -l:libjsoncpp.a
2.3 rapidjson
- http://rapidjson.org/
2.4 nlohmann/json
- https://github.com/nlohmann/json
- nlohmann入门使用总结
2.5 sonic-cpp
- 当前仅支持amd64
- 开源 C++ JSON 库 sonic-cpp解析性能为 rapidjson 的 2.5 倍
- 性能提升 2.5 倍!字节开源高性能 C++ JSON 库 sonic-cpp
五、常见问题
5.1 jsoncpp 中关于浮点数的控制和中文显示问题
- jsoncpp 中关于浮点数的控制和中文显示问题
5.2 jsoncpp序列化double类型时精度损失问题的解决办法
- jsoncpp序列化double类型时精度损失问题的解决办法
解决办法1:此法不需要改源码,使用StreamWriterBuilder进行序列化
#include <json/json.h>
#include <json/writer.h>
#include <iostream>
#include <string>void test_precision(int precision)
{Json::Value root;root["pi"] = 3.1415926;root["count"] = 43.32558674566;Json::StreamWriterBuilder builder;//设置精度 注意这个默认设置的是数字总长度 //如果想设置小数点后的位数需设置precisionType为decimalbuilder.settings_["precision"] = precision;//设置精度类型 只可设置2种字符串 significant精度位数为数字总长度(jsoncpp默认为此类型) decimal精度位数为小数点后的长度builder.settings_["precisionType"] = "decimal";// 设置输出为紧凑格式,不带换行和空格builder["commentStyle"] = "None"; // 防止输出注释,默认就是nonebuilder["indentation"] = ""; // 空字符串表示不缩进std::unique_ptr<Json::StreamWriter> writer(builder.newStreamWriter());std::ostringstream oss;writer->write(root, &oss);std::string jsonText = oss.str();// 输出 JSON 字符串std::cout << "specified precision: " << precision << ", content:" << jsonText << std::endl;
}int main() {for(int i=17; i>=0; i--){test_precision(i);}return 0;
}
specified precision: 17, content:{"count":43.32558674565999723,"pi":3.14159260000000007}
specified precision: 16, content:{"count":43.3255867456599972,"pi":3.1415926000000001}
specified precision: 15, content:{"count":43.325586745659997,"pi":3.1415926}
specified precision: 14, content:{"count":43.32558674566,"pi":3.1415926}
specified precision: 13, content:{"count":43.32558674566,"pi":3.1415926}
specified precision: 12, content:{"count":43.32558674566,"pi":3.1415926}
specified precision: 11, content:{"count":43.32558674566,"pi":3.1415926}
specified precision: 10, content:{"count":43.3255867457,"pi":3.1415926}
specified precision: 9, content:{"count":43.325586746,"pi":3.1415926}
specified precision: 8, content:{"count":43.32558675,"pi":3.1415926}
specified precision: 7, content:{"count":43.3255867,"pi":3.1415926}
specified precision: 6, content:{"count":43.325587,"pi":3.141593}
specified precision: 5, content:{"count":43.32559,"pi":3.14159}
specified precision: 4, content:{"count":43.3256,"pi":3.1416}
specified precision: 3, content:{"count":43.326,"pi":3.142}
specified precision: 2, content:{"count":43.33,"pi":3.14}
specified precision: 1, content:{"count":43.3,"pi":3.1}
specified precision: 0, content:{"count":43,"pi":3}
-
精度控制:precision
- 15,16,17:原值会变、四舍五入
- 0-14:原值不变的情况下,四舍五入
-
特别注意:精度设置一定要大于你需求的精度位数,比如需要三位可以设置4位或5位,因为最后一位可能会不准(做了四舍五入)
不足之处:
StreamWriterBuilder序列化的字符串是可读形式的,就像上面的输出,是有换行和缩进的(转换效率会比FastWrite低),我的服务端代码里其实不需要转换json为可读的,更需要的是效率,所以还有下面一种方法改FasetWrite源码
解决办法2:此法需要改源码,使用FastWriter进行序列化
-
注意:需升级jsoncpp到最新版本1.9.5版本
-
修改源码(writer.h):FastWriter类新增2个成员变量(precision_和precisionType_)和成员函数(set_precision和set_precisionType)
#if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable : 4996) // Deriving from deprecated class #endif class JSON_API FastWriter: public Writer { public:FastWriter();~FastWriter() override = default;void enableYAMLCompatibility();/** \brief Drop the "null" string from the writer's output for nullValues.* Strictly speaking, this is not valid JSON. But when the output is being* fed to a browser's JavaScript, it makes for smaller output and the* browser can handle the output just fine.*/void dropNullPlaceholders();void omitEndingLineFeed();public: // overridden from WriterString write(const Value& root) override;//设置精度位数void set_precision(unsigned int precision) { precision_ = (precision > 17)?17:precision; };//设置精度类型 默认为数字总长//入参:isDecimal true表示类型为小数点后长度 false表示类型为数字总长void set_precisionType(bool isDecimal) { isDecimal ? (precisionType_ = PrecisionType::decimalPlaces) : (precisionType_ = PrecisionType::significantDigits); };private:void writeValue(const Value& value);String document_;bool yamlCompatibilityEnabled_{false};bool dropNullPlaceholders_{false};bool omitEndingLineFeed_{false};int precision_{ 17 };//精度位数 默认17位PrecisionType precisionType_{ PrecisionType::significantDigits };//精度类型 默认为数字总长 }; #if defined(_MSC_VER) #pragma warning(pop) #endif
-
修改源码(json_writer.cpp):只修改了1行代码,FastWriter::writeValue函数中case realValue的处理中调用的valueToString新增了2个参数传递(源码中没有传递用的函数默认值,现在传了并且可以通过新增的2个成员函数进行设置)
void FastWriter::writeValue(const Value& value) {switch (value.type()) {case nullValue:if (!dropNullPlaceholders_)document_ += "null";break;case intValue:document_ += valueToString(value.asLargestInt());break;case uintValue:document_ += valueToString(value.asLargestUInt());break;case realValue://这里原先是document_ += valueToString(value.asDouble());//因为后2个参数没传,所以用的函数默认值即精度位数=17,精度类型=PrecisionType::significantDigits//修改后 现在会传这2个参数,具体值可以通过新增加的2个成员函数设置document_ += valueToString(value.asDouble(), precision_, precisionType_);break;case stringValue: {// Is NULL possible for value.string_? No.char const* str;char const* end;bool ok = value.getString(&str, &end);if (ok)document_ += valueToQuotedStringN(str, static_cast<size_t>(end - str));break;}case booleanValue:document_ += valueToString(value.asBool());break;case arrayValue: {document_ += '[';ArrayIndex size = value.size();for (ArrayIndex index = 0; index < size; ++index) {if (index > 0)document_ += ',';writeValue(value[index]);}document_ += ']';} break;case objectValue: {Value::Members members(value.getMemberNames());document_ += '{';for (auto it = members.begin(); it != members.end(); ++it) {const String& name = *it;if (it != members.begin())document_ += ',';document_ += valueToQuotedStringN(name.data(), name.length());document_ += yamlCompatibilityEnabled_ ? ": " : ":";writeValue(value[name]);}document_ += '}';} break;} }
-
需要重新编译库,然后demo验证,使用的代码:
#include <json/json.h> #include <json/writer.h> #include <iostream> #include <string>void test_precision(int precision) {Json::Value obj;Json::FastWriter write;write.set_precision(precision);write.set_precisionType(true);obj["d"] = 2.1;obj["d2"] = 9.111;obj["d3"] = 9.123456789;auto rtn = write.write(obj);std::cout << "specified precision: " << precision << ", rtn:" << rtn << std::endl; }int main() {for(int i=17; i>=0; i--){test_precision(i);}return 0; }
specified precision: 17, rtn:{"d":2.10000000000000009,"d2":9.11100000000000065,"d3":9.12345678900000046}specified precision: 16, rtn:{"d":2.1000000000000001,"d2":9.1110000000000007,"d3":9.1234567890000005}specified precision: 15, rtn:{"d":2.1,"d2":9.111000000000001,"d3":9.123456789}specified precision: 14, rtn:{"d":2.1,"d2":9.111,"d3":9.123456789}specified precision: 13, rtn:{"d":2.1,"d2":9.111,"d3":9.123456789}specified precision: 12, rtn:{"d":2.1,"d2":9.111,"d3":9.123456789}specified precision: 11, rtn:{"d":2.1,"d2":9.111,"d3":9.123456789}specified precision: 10, rtn:{"d":2.1,"d2":9.111,"d3":9.123456789}specified precision: 9, rtn:{"d":2.1,"d2":9.111,"d3":9.123456789}specified precision: 8, rtn:{"d":2.1,"d2":9.111,"d3":9.12345679}specified precision: 7, rtn:{"d":2.1,"d2":9.111,"d3":9.1234568}specified precision: 6, rtn:{"d":2.1,"d2":9.111,"d3":9.123457}specified precision: 5, rtn:{"d":2.1,"d2":9.111,"d3":9.12346}specified precision: 4, rtn:{"d":2.1,"d2":9.111,"d3":9.1235}specified precision: 3, rtn:{"d":2.1,"d2":9.111,"d3":9.123}specified precision: 2, rtn:{"d":2.1,"d2":9.11,"d3":9.12}specified precision: 1, rtn:{"d":2.1,"d2":9.1,"d3":9.1}specified precision: 0, rtn:{"d":2,"d2":9,"d3":9}
C++ json序列化库有哪些,哪个性能最好
C++中有多种JSON序列化库可供选择,包括但不限于以下几种:
-
Rapidjson:这是一个非常流行的C++ JSON库,以其高性能著称,由腾讯团队开发 。
-
nlohmann/json:这是一个现代的、基于C++11的JSON库,以其易用性和直观的接口而受到许多C++程序员的青睐 。
-
sonic-cpp:由字节跳动STE团队和服务框架团队共同研发的高效JSON库,它利用CPU硬件特性和向量化编程,大幅提高了序列化和反序列化的性能。据报道,其解析性能是rapidjson的2.5倍 。
-
JsonCpp:这是一个成熟的库,提供了丰富的功能来处理JSON数据。
-
simdjson:这是一个使用SIMD指令集来加速解析的库,它提供了快速的解析性能,但不支持修改解析后的JSON结构 。
-
yyjson:这是一个追求解析性能的库,使用链表结构,但在查找数据时性能较差 。
在这些库中,sonic-cpp 被报道为性能最好的库,它不仅提供了高效的解析性能,还解决了其他一些库的缺点,如simdjson和yyjson的问题,并支持高效的增删改查操作 。此外,sonic-cpp已经在字节跳动的多个核心业务中大规模使用,并通过了工程化的考验 。
如果您对性能有极高的要求,sonic-cpp可能是一个不错的选择。然而,选择哪个库还应考虑其他因素,如易用性、社区支持、库的活跃度和维护情况。
相关文章:

C/C++ json库
文章目录 一、介绍1.1 json 介绍 二、C/C json 库选型2.1 选型范围2.2 jsoncpp2.2.2 jsoncpp 编译和交叉编译 2.3 rapidjson2.4 nlohmann/json2.5 sonic-cpp 五、常见问题5.1 jsoncpp 中关于浮点数的控制和中文显示问题5.2 jsoncpp序列化double类型时精度损失问题的解决办法 一…...
C++案例四:简易记事本程序
文章目录 程序介绍代码说明包含必要的头文件主函数定义变量定义主循环显示菜单和读取选择处理用户选择程序介绍 编写一个简单的记事本程序,可以帮助用户添加和查看笔记。这个案例可以练习C++中的输入输出、向量(std::vector)、字符串处理(std::string)、以及简单的控制结…...
【VUE学习】day03-过滤器filter
VUE学习第三天 过滤器filter全局过滤器私有过滤器 过滤器filter 作用:常见的文本格式化使用场景:插值表达式、v-bind用法:{{msg | filterName}} ; v-bind:属性‘msg | filterName’ msg:需要格式化的文本信息(管道符前面的数据&a…...

技术成神之路:设计模式(八)责任链模式
介绍 责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象依次处理请求,避免请求的发送者和接收者之间的显式耦合。该模式通过将多个可能处理请求的对象连接成一条链,并沿着这条链传递请求…...

【Zynq UltraScale+ RFSoC】~~~
Zynq UltraScale RFSoC 系列为 5G 无线和射频级模拟应用引入了颠覆性的集成和架构突破,可直接支持整个 5G sub-6GHz 频段。这个创新系列现已开始批量生产。此设计演示展示了多通道(8T8R 或 16T16R)Zynq UltraScale RFSoC 评估工具工具工具&am…...

STM32之八:IIC通信协议
目录 1. IIC协议简介 1.1 主从模式 1.2 2根通信线 2. IIC协议时序 2.1 起始条件和终止条件 2.2 应答信号 2.3 发送一个字节 2.4 接收一个字节 3. IIC读写操作 3.1 写操作 3.2 读操作 1. IIC协议简介 IIC协议是一个半双工、同步、一主多从、多主多从的串行通用数据总…...
mysql的数据往hive进行上报时怎么保证数据的准确性和一致性
在将MySQL的数据往Hive进行上报时,确保数据的准确性和一致性可以通过下面一系列步骤来实现 一、准备工作 环境配置: 确保MySQL和Hive环境已经安装并配置好,且都处于可运行状态。检查Hadoop集群(Hive通常运行在Hadoop之上&#x…...

问题:4、商业保险与政策性保险的主要不同之处是:经营主体不同、经营目标不同、承保机制不同。 #学习方法#其他#学习方法
问题:4、商业保险与政策性保险的主要不同之处是:经营主体不同、经营目标不同、承保机制不同。 参考答案如图所示...

Getx学习笔记之中间件鉴权
目录 前言 一、实现步骤 1.添加依赖 2.创建鉴权中间件 3.定义路由 4.设置初始路由 5.模拟登陆状态 二、Getx鉴权步骤总结 三、本文demo示例 四、参考文章 前言 在 Flutter 中,使用 GetX 可以很方便地实现中间件鉴权(Authentication)…...

介绍 Elasticsearch 中的 Learning to Tank - 学习排名
作者:来自 Elastic Aurlien Foucret 从 Elasticsearch 8.13 开始,我们提供了原生集成到 Elasticsearch 中的学习排名 (learning to rank - LTR) 实现。LTR 使用经过训练的机器学习 (ML) 模型为你的搜索引擎构建排名功能。通常,该模型用作第二…...

2024年计算机软考中级【硬件工程师】面试题目汇总(附答案)
硬件工程师面试题汇总分析 1、解释一下同步电路和异步电路 解题思路 同步电路和异步电路是指同步时序电路和异步时序电路。由于存储电路中触发器的动作特点不同,因此可以把时序电路分为同步时序电路和异步时序电路两种。同步时序电路所有的触发器状态的变化都是在同…...

ThinkPad改安装Windows7系统的操作步骤
ThinkPad:改安装Windows7系统的操作步骤 一、BIOS设置 1、先重新启动计算机,并按下笔记本键盘上“F1”键进入笔记本的BIOS设置界面。 2、进入BIOS设置界面后,按下键盘上“→”键将菜单移动至“Restart“项目,按下键盘上“↓”按键…...
微软Edge浏览器全解析教程
微软Edge浏览器全解析教程 微软Edge浏览器,作为微软公司精心打造的一款现代化网页浏览器,自其首次发布以来,凭借其卓越的性能、出色的用户体验和不断迭代的功能,赢得了广大用户的青睐。本文将全面解析微软Edge浏览器的各个方面&a…...

【过题记录】7.20
前两题一直在打模拟赛,有点忙,就没更 Red Playing Cards 算法:动态规划 其实这就是一个线段覆盖问题,只不过大线段能够包含小线段。 这就启发我们,对于每个大线段分别跑一个dp,合并在他内部的小线段。而后…...

Linux系统学习日记——vim操作手册
Vim编辑器是linux下的一个命令行编辑器,类似于我们windows下的记事本。 目录 打开文件 编辑 保存退出 打开文件 打开 hello.c不存在也可以打开,保存时vim会自动创建。 效果 Vim打开时,处于命令模式,即执行命令的模式&#x…...
【深度学习图片】图片清洗,只留下图像中只有一张人脸的,而且人脸是全的
环境: conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidia -ypip install onnx1.15 onnxruntime-gpu1.17pip install insightface0.7.3pip install opencv-pythonpip install gradio图片清洗,只留下图像中只有一张人脸…...

如何在 PostgreSQL 中处理海量数据的存储和检索?
🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!📚领书:PostgreSQL 入门到精通.pdf 文章目录 如何在 PostgreSQL 中处理海量数据的存储和检索?一、优化表结构设计二、分区技术三、数据压…...

【中项】系统集成项目管理工程师-第2章 信息技术发展-2.2新一代信息技术及应用-2.2.1物联网与2.2.2云计算
前言:系统集成项目管理工程师专业,现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试,全称为“全国计算机与软件专业技术资格(水平)考试”&…...

Redis集群的主从复制原理-全量复制和增量复制-哨兵机制
Redis集群的主从复制原理-全量复制和增量复制-哨兵机制 作用 数据备份 这一点直观,因为现在有很多节点,每个节点都保存了原始数据的备份. 读写分离 这一点主要是当发生读写的时候,读数据的操作大部分都会进入到从节点,而写数据的操作都会进入到主节点&…...
23年阿里淘天笔试题 | 卡码网模拟
第一题 字典序最小的 01 字符串 解题思路: 模拟,统计遇到的连续的1的个数记为num,直到遇到0,如果k>num,直接将第一个1置为0,将遇到的0置为1,否则将第一个1偏置num-k个位置置为0࿰…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...