jsoncpp库的编译与使用
环境介绍
操作系统:Windows11_22H2(版本22621.1194)
编辑器:VS Code
编译器:g++ (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0
编译工具:cmake version 3.21.0-rc1
jsoncpp库的编译
jsoncpp的源码地址https://github.com/open-source-parsers/jsoncpp
将源码下载,然后使用mingw进行编译,过程如下所示:
编译环境及工具简介
在Windows平台下使用mingw和cmake进行编译,使用的软件为VS Code,搭配其C++插件、cmake插件等完成编译。使用VS Code创建和编译cmake工程的方法戳这里。
配置CMakeLists.txt
使用VS Code打开源码的目录,然后在CMakeLists.txt上点击右键,选择配置所有项目
,如果需要选择kit,可以根据自己的需要进行选择,我这里选择的是mingw。如果配置正常,那么就会在目录中创建build文件夹。
编译安装
根据个人需要选择编译类型(默认为Debug模式,便于后续开发中的调试,也可以改为Release模式),然后选择编译项目为install
,再点击Build
按钮进行安装:
如果显示编译正常结束,退出代码为0表示已经编译完成,如下所示:
编译结果说明
install的安装编译结果下,以.a
为后缀的静态链接库存放在C:/Program Files (x86)/jsoncpp/lib/
目录中,以.dll
为后缀的动态库存放在C:/Program Files (x86)/jsoncpp/bin/
目录中,头文件存放在C:/Program Files (x86)/jsoncpp/include/
目录中。可以将这些目录添加到对应的工程中,或者直接将这些目录拷贝到自己的工程中。
注意:以.dll
结尾的动态运行库需要添加到系统环境变量的PATH中,或者直接将其和项目的可执行文件放在同一层目录中。
jsoncpp库的使用
jsoncpp的使用参考了源码中的示例代码,并进行了一定的更改。同时,为了方便组织文件目录,采用了以下的文件结构:
│ CMakeLists.txt
│ test.json
│
├─include
│ └─json
│ allocator.h
│ assertions.h
│ config.h
│ forwards.h
│ json.h
│ json_features.h
│ reader.h
│ value.h
│ version.h
│ writer.h
│
├─lib
│ libjsoncpp.a
│ libjsoncpp.dll.a
│
└─src
readFromStream.cpp
readFromString.cpp
streamWrite.cpp
stringWrite.cpp
其一,jsconcpp的动态库路径已经加入系统环境变量了。
其二,工程中的CMakeLists.txt内容如下所示:
cmake_minimum_required(VERSION 3.15)
project(UseJsonCPP LANGUAGES CXX)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)
set(CMAKE_CXX_STANDARD 11)
add_executable(${PROJECT_NAME}_readFromStream src/readFromStream.cpp)
target_link_libraries(${PROJECT_NAME}_readFromStream jsoncpp)
add_executable(${PROJECT_NAME}_readFromString src/readFromString.cpp)
target_link_libraries(${PROJECT_NAME}_readFromString jsoncpp)
add_executable(${PROJECT_NAME}_streamWrite src/streamWrite.cpp)
target_link_libraries(${PROJECT_NAME}_streamWrite jsoncpp)
add_executable(${PROJECT_NAME}_stringWrite src/stringWrite.cpp)
target_link_libraries(${PROJECT_NAME}_stringWrite jsoncpp)
readFromStream
该示例的作用是从一个文件流中读取json数据,然后输出到屏幕上,使用的json文件内容和源码如下所示:
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.18362.0",
"compilerPath": "D:/Software/mingw64/bin/g++.exe",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "windows-gcc-x64"
}
],
"version": 4
}
源文件:
#include <fstream>
#include <iostream>
#include "json/json.h"
int main(int argc, char* argv[]) {
Json::Value root;
std::ifstream ifs;
// 从一个json文件中读取数据并输出到屏幕,路径请根据自己的文件路径修改
ifs.open("D://third_part_lib//jsconCPP_test//test.json");
Json::CharReaderBuilder builder;
builder["collectComments"] = true;
JSONCPP_STRING errs;
if (!parseFromStream(builder, ifs, &root, &errs)) {
std::cout << errs << std::endl;
return EXIT_FAILURE;
}
std::cout << root << std::endl;
return EXIT_SUCCESS;
}
运行结果:
{
"configurations" :
[
{
"cStandard" : "c17",
"compilerPath" : "D:/Software/mingw64/bin/g++.exe",
"cppStandard" : "c++17",
"defines" :
[
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"includePath" :
[
"${workspaceFolder}/**"
],
"intelliSenseMode" : "windows-gcc-x64",
"name" : "Win32",
"windowsSdkVersion" : "10.0.18362.0"
}
],
"version" : 4
}
streamWrite
该示例的作用是将一组json格式的数据输出到标准输出流std::cout
中,源码如下所示:
#include <iostream>
#include <memory>
#include "json/json.h"
int main() {
Json::Value root;
Json::StreamWriterBuilder builder;
const std::unique_ptr<Json::StreamWriter> writer(builder.newStreamWriter());
root["Name"] = "robin";
root["Age"] = 20;
writer->write(root, &std::cout);
return EXIT_SUCCESS;
}
运行结果:
{
"Age" : 20,
"Name" : "robin"
}
readFromString
该示例的作用是将字符串表示的json格式数据进行解析并输出显示,源码如下所示:
#include <iostream>
#include <memory>
#include "json/json.h"
int main() {
const std::string rawJson = R"({"Age": 20, "Name": "colin"})";
const auto rawJsonLength = static_cast<int>(rawJson.length());
constexpr bool shouldUseOldWay = false;
JSONCPP_STRING err;
Json::Value root;
if (shouldUseOldWay) {
Json::Reader reader;
reader.parse(rawJson, root);
} else {
Json::CharReaderBuilder builder;
const std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
if (!reader->parse(rawJson.c_str(), rawJson.c_str() + rawJsonLength, &root,
&err)) {
std::cout << "error" << std::endl;
return EXIT_FAILURE;
}
}
const std::string name = root["Name"].asString();
const int age = root["Age"].asInt();
std::cout << name << std::endl;
std::cout << age << std::endl;
return EXIT_SUCCESS;
}
运行结果:
colin
20
stringWrite
该示例的作用是将一组json格式的数据转换成string字符串,然后打印到屏幕上,源码如下所示:
#include <iostream>
#include "json/json.h"
int main() {
Json::Value root;
Json::Value data;
constexpr bool shouldUseOldWay = false;
root["action"] = "run";
data["number"] = 1;
root["data"] = data;
if (shouldUseOldWay) {
Json::FastWriter writer;
const std::string json_file = writer.write(root);
std::cout << json_file << std::endl;
} else {
Json::StreamWriterBuilder builder;
const std::string json_file = Json::writeString(builder, root);
std::cout << json_file << std::endl;
}
return EXIT_SUCCESS;
}
运行结果:
{
"action" : "run",
"data" :
{
"number" : 1
}
}
Comments | 2 条评论
博客作者 不找到好工作不改网名
vcpkg可以使用,与VS很搭配
博客作者 songjiahao
@不找到好工作不改网名 我用过一次,但是感觉还是难用,像一个半成品的包管理器。我感觉在windows上开发真的是体验很差,目前还是把jsoncpp用在项目里面,而且是在linux系统下,这篇只是记录一下。