Openssl数据安全传输平台010:Centos7-jasoncpp 0.11.0与Windows和Centos8-jasoncpp 1.9.5编译及常用API

0. 代码仓库及相关视频

0.1 代码仓库

https://github.com/Chufeng-Jiang/OpenSSL_Secure_Data_Transmission_Platform/tree/main/Preparation

0.2 视频传送门

Centos7环境下编译jsoncpp0.11.0视频
https://www.bilibili.com/video/BV1we411R7sS/?vd_source=3353f83539e46042d8cf76efb177a8e4

08-Centos7学习使用cmake生成动态库-jsoncpp0.11版本

1 安装注意版本问题

A note on backward-compatibility

  • 1.y.z is built with C++11.
  • 0.y.z can be used with older compilers.
  • 00.11.z can be used both in old and new compilers.

Major versions maintain binary-compatibility.
在这里插入图片描述

1.1 windows 下的安装

  • 在windows下 将 jsoncpp-1.9.5.zip解压缩

  • 进入到解压目录jsoncpp-1.9.5, 在进入到子目录cmake

  D:\ProgramData\jsoncpp\jsoncpp-1.9.5

1.1.1 使用cmake生成sln工程

在这里插入图片描述
在这里插入图片描述
选中Shared Libs,以后生成的就是动态库。

点击generate,生成了sln工程

在这里插入图片描述

1.1.2 使用sln工程生成静态库 -Debug

在这里插入图片描述

  • 生成的静态库存储目录D:\ProgramData\jsoncpp\build\lib\Debug

  • 生成的静态库文件: jsoncpp.lib

    在这里插入图片描述

  • 使用的准备工作:

    • 将静态库jsoncpp.lib拿出备用
    • 将库对应的头文件拿出, 在原始的下载源码包里,头文件目录D:\ProgramData\jsoncpp\jsoncpp-1.9.5\include\json

在这里插入图片描述

  • 把文件拿出来备用,或者直接在VS 项目配置中添加相应的路径和库名字

  • vs编译过程中, 修改属性
    在这里插入图片描述

1.2 Centos7 下的安装 - 金融安全数据传输项目使用这个

1.2.1 jsonspp0.11.0下载

https://github.com/open-source-parsers/jsoncpp/releases

1.2.2 编译与安装

将下载好的压缩包发送到Centos7上解压缩

tar -zxvf jsoncpp-00.11.0.tar.gz

cd jsoncpp-00.11.0

//在解压缩的目录里创建buil文件夹
mkdir build

//在当前文件夹下执行cmake
cmake -S /home/beza/Documents/jsoncpp-00.11.0/src -B /home/beza/Documents/jsoncpp-00.11.0/build


// 进入build文件夹执行
cd build

// 生成动态库成功,进入动态库所在的位置
cd  ./build/lib_json/

// 将动态库拷贝到系统目录下
sudo cp /home/beza/Documents/jsoncpp-00.11.0/build/lib_json/libjsoncpp.a  /lib

// 将头文件拷贝到系统目录下
sudo cp /home/beza/Documents/jsoncpp-00.11.0/include/json /usr/include/ -r

//执行指令更新动态库
sudo ldconfig

在这里插入图片描述

1.2.3 配置环境变量

因为都是在系统默认路径下,所以不用修改/etc/profile…

1.2 Centos8 下的安装

1.2.1 安装jsoncpp

git clone https://github.com/Microsoft/vcpkg.git
./vcpkg install jsoncpp

在这里插入图片描述
vkpkg生成的文件参考

/home/beza/Desktop/jsoncpp/vcpkg/installed/x64-linux

// 将这个Debug文件拷贝到Centos的/lib目录
/home/beza/Desktop/jsoncpp/vcpkg/installed/x64-linux/debug/lib/libjsoncpp.a

//这个版本不知道是什么版本,没有测试
/home/beza/Desktop/jsoncpp/vcpkg/installed/x64-linux/lib/libjsoncpp.a

// 拷贝json的头文件到系统目录中, 需要管理员权限
/home/beza/Desktop/jsoncpp/vcpkg/installed/x64-linux/include
/home/beza/Desktop/jsoncpp/vcpkg/installed/x64-linux/include/json
/home/beza/Desktop/jsoncpp/vcpkg/installed/x64-linux/include/json/allocator.h
/home/beza/Desktop/jsoncpp/vcpkg/installed/x64-linux/include/json/assertions.h
/home/beza/Desktop/jsoncpp/vcpkg/installed/x64-linux/include/json/config.h
/home/beza/Desktop/jsoncpp/vcpkg/installed/x64-linux/include/json/forwards.h
/home/beza/Desktop/jsoncpp/vcpkg/installed/x64-linux/include/json/json.h
/home/beza/Desktop/jsoncpp/vcpkg/installed/x64-linux/include/json/json_features.h
/home/beza/Desktop/jsoncpp/vcpkg/installed/x64-linux/include/json/reader.h
/home/beza/Desktop/jsoncpp/vcpkg/installed/x64-linux/include/json/value.h
/home/beza/Desktop/jsoncpp/vcpkg/installed/x64-linux/include/json/version.h
/home/beza/Desktop/jsoncpp/vcpkg/installed/x64-linux/include/json/writer.h
// 将生成的动态库/静态库拷贝到系统的库目录中, 需要管理员权限,centos是gcc7

//拷贝动态库--注意这里是Debug版本
sudo cp /home/beza/Desktop/jsoncpp/vcpkg/installed/x64-linux/debug/lib/libjsoncpp.a  /lib

// 拷贝json的头文件到系统目录中, 需要管理员权限
sudo cp /home/beza/Desktop/jsoncpp/vcpkg/installed/x64-linux/include/json /usr/include/ -r

// 更新, 这样才能搜索到动态库libjsoncpp.a。需要管理员权限
sudo ldconfig    

1.2.2 旧版本0.10.x版本相关环境配置问题

要安装python2,参考以下文章…哎…我把centos下安装py2搞复杂了,浪费了一上午,竟然还打算自己去编译py2的源码,简直脑子进水…

Centos8: 安装python2, 并设置默认版本

  1. python与python3

/usr/bin/env: ‘python’: No such file or directory“:Linux中python口令无效,python3有效

  1. python2和python3 print语句的括号问题
    python2中的语句是不用加括号的,但是python3中的print需要加语句。这导致了使用python3配环境时候出现以下错误
    在这里插入图片描述

2 Winsows环境下编译 c++ 测试文件: json-test.cpp

g++ json-test.cpp -ljsoncpp -o json

2.1 配置库文件

把备份的库文件拷贝到工程目录下在这里插入图片描述

2.2 配置VS

在这里插入图片描述在这里插入图片描述

2.3 Winsows系统下cpp文件测试

#include <json.h>
#include <iostream>
#include <fstream>
using namespace Json;	// jsoncpp的命名空间
using namespace std;


void writeJson()
{
	// 组织数据, 并写入到磁盘文件
// [12, 19.8, true, "hello", ["a", "b", "c"], {"name":"xiaoming"}, "age":12]
	Value v;
	v.append(Value(12));
	v.append(19.8);
	v.append(true);
	v.append("hello");

	// 创建一个数组对象 Value
	Value arr;
	arr.append("a");
	arr.append("b");
	arr.append("c");

	// 创建json对象 -> Value
	Value obj;
	obj["name"] = "xiaoming";
	obj["age"] = 12;

	v.append(arr);
	v.append(obj);

	// 将得到Value对象 v 格式化 -> string -> 写磁盘
	string st = v.toStyledString();
	cout << "v style: " << st << endl;
	FastWriter fw;
	string jsonText = fw.write(v);
	cout << "jsonText: " << jsonText << endl;

	// 创建写文件的流对象
	// ofstream of;
	// of.open("test.json");
	ofstream of("test.json");
	of << st;
	of.close();
}

void readJson()
{
	// 1. 将磁盘文件数据读出 -> string
	ifstream ifs("test.json");
	// 2. 将string -> Value 对象中
	Reader rd;
	Value root;
	rd.parse(ifs, root);
	// 3 打印输出
	// 遍历数组
	for (int i = 0; i < root.size(); ++i)
	{
		Value sub = root[i];
		if (sub.isInt())
		{
			cout << sub.asInt() << " ";
		}
		else if (sub.isDouble())
		{
			cout << sub.asDouble() << " ";
		}
		else if (sub.isBool())
		{
			cout << sub.asBool() << " ";
		}
		else if (sub.isString())
		{
			cout << sub.asString() << " ";
		}
		else if (sub.isArray())
		{
			// 继续遍历这个子数组
			for (int j = 0; j < sub.size(); ++j)
			{
				cout << sub[j].asString() << " ";
			}
			cout << endl;
		}
		else if (sub.isObject())
		{
			// 根据对象中的key, 打印value值
			cout << sub["name"].asString() << ", "
				<< sub["age"].asInt() << " ";
		}
	}
}

int main()
{
	writeJson();
//	readJson();
}

2.3.1 写json测试结果

在这里插入图片描述
在这里插入图片描述

2.3.2 读json测试结果

在这里插入图片描述

3 jsoncpp常用API

3.1 Value -> 对Json支持的数据类型进行封装/解析

// Json支持的数据类型
Type = {int, double, float, string, char*, bool, JsonArray, JsonObject}
// 构造函数
  Value(ValueType type = nullValue);
  Value(Int value);
  Value(UInt value);
#if defined(JSON_HAS_INT64)
  Value(Int64 value);
  Value(UInt64 value);
#endif // if defined(JSON_HAS_INT64)
  Value(double value);
  Value(const char* value); ///< Copy til first 0. (NULL causes to seg-fault.)
  Value(const char* begin, const char* end);

// 将Value对象转换成对应类型的数据
  Int asInt() const;
  UInt asUInt() const;
#if defined(JSON_HAS_INT64)
  Int64 asInt64() const;
  UInt64 asUInt64() const;
#endif // if defined(JSON_HAS_INT64)
  LargestInt asLargestInt() const;
  LargestUInt asLargestUInt() const;
  float asFloat() const;
  double asDouble() const;
  bool asBool() const;

// 判断Value对象中存储的数据的类型
  bool isNull() const;
  bool isBool() const;
  bool isInt() const;
  bool isInt64() const;
  bool isUInt() const;
  bool isUInt64() const;
  bool isIntegral() const;
  bool isDouble() const;
  bool isNumeric() const;
  bool isString() const;
  bool isArray() const;
  bool isObject() const;

// 取值 
// 格式化 -> 将对象转换为字符串
// 适合于查看信息或者写文件
std::string toStyledString() const;

3.2 Reader

// json格式字符串 -> Value对象
// c++
bool parse(const std::string& document, Value& root, bool collectComments = true);
    参数:
        - document: json字符串, 传入参数
        - root: 传出参数, 转换完成之后的Value对象
// c用法
bool parse(const char* beginDoc, const char* endDoc, 
           Value& root, bool collectComments = true);
    参数:
        - beginDoc: 字符串起始地址
        - endDoc: 字符串结束地址
        - root: 传出参数, 转换完成之后的Value对象
// c++用法
bool parse(std::istream& is, Value& root, bool collectComments = true);
    参数:
        - is: 文件流对象, 使用这个流对象打开一个磁盘文件
        - root: 传出参数, 转换完成之后的Value对象

3.3 FastWriter

// 将Value对象中的数据格式化 -> 字符串
// 适合于网络数据的发送
// 得到的字符串中没有换行符
std::string write(const Value& root);

// 得到这个返回值:
    - 写磁盘 -> 写到配置文件中
    - 网络传参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大大枫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值