[C++] JsonCPP 的使用 完整配置过程

本文详细记录了在C++环境下配置并使用jsoncpp库的过程,包括解决配置失败、找不到文件、未定义符号等问题,以及如何正确编译并链接lib文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近准备开发一个程序 需要用到C++ 解析json 

原始的C++解析json是不现实的 自己也写不出来json解析方法(主要是不靠谱)

所以找到了jsoncpp 这个库 但是。。。 因为各种原因 配置的让我想哭 接下来我来分享一下 我配置这个库的过程吧

 

首先发现了这个博文(感谢)

https://www.cnblogs.com/esCharacter/p/7657676.html#commentform

从这个博文中找到了json的项目地址 然后下载了下来  https://github.com/open-source-parsers/jsoncpp

得到了这样的目录

 

 

接着,按照博文说的开始构建 dist... 这里需要安装python  我的电脑已经安装好了 直接运行那个命令 

python amalgamate.py

  发现会失败... 

  会提示找不到一个文件...

  去看了github上面的iss 然后知道需要先cmake 一下 

  但是那个提出解决方案的人是ubuntu 的操作系统 在windows下默认是没有cmake的 

  我就想到了我的vs2019似乎是有这个文件的 在vs的安装目录下直接搜索 cmake.exe 然后找到了 打开这个文件所在位置

  cmd 切换目录到 jsoncpp源码根目录 拖动cmake.exe 到cmd窗口 输入一个空格 然后拖入CMakeLists.txt 执行即可

 

   这时候才可以运行 python amalgamate.py

  之后就能得到dist 复制里面的所有文件和文件夹 到你的工程下(和cpp文件同目录)

  包含头文件: 

    #include "json/json.h"
    #include "json/json-forwards.h"

  运行博文里面的代码之后 会发现符号未定义什么的错误 

      LNK2019 无法解析的外部符号 "public: __thiscall Json::Value::Value(enum Json::ValueType)" (??0Value@Json@@QAE@W4ValueType@1@@Z),该符号在函数 _main 中被引用 Click       C:\Users\admin\source\repos\Click\源.obj 1

  这个是因为没有lib文件导致的 

  百度之后发现他们都是用vc6编译的 

  但是我发现那个jsoncpp文件夹下 有一个sln 文件 双击之后打开工程 在右侧找到jsoncpp_lib 项目 设置为运行 设置 

 

 

  然后编译 注意看编译器的输出 找到lib文件的位置

  把.lib文件复制到你的项目文件夹里面 与.cpp文件同路径

  代码中导入 lib文件

  然后你的项目也要设置(这里是要和编译的lib文件一致 所以 都是Debug模式也是可以的吧(猜测))

 

 

  完整测试代码如下

#include <iostream>
#include "json/json.h"
#include "json/json-forwards.h"
#pragma comment(lib,"jsoncpp.lib")
using namespace std;
int main()
{
    try {
        //Json::Value jsonRoot; //定义根节点
        Json::Value jsonItem; //定义一个子对象
        jsonItem["item1"] = "one"; //添加数据
        jsonItem["item2"] = 2;
        //jsonRoot.append(jsonItem);
        //jsonItem.clear(); //清除jsonItem
        jsonItem["item1.0"] = 1.0;
        jsonItem["item2.0"] = 2.0;
        //jsonRoot["item"] = jsonItem;
        cout << jsonItem.toStyledString() << endl; //输出到控制台
    }catch(Json::LogicError)
    {
        cout << "发生异常" << endl;
    }
    return 0;
}

 

最终输出

 

 

就彻底成功了.....

 

对我而言 出现这样的问题... 就是没用过lib的原因吧.... 第一次通过原始的C++使用这样的库

此次没有使用QT的原因就i是感觉Qt项目发行之后 体积太大了.... 

原生C++ 解析json确实不太方便...

 

转载于:https://www.cnblogs.com/cjdty/p/11556096.html

### 如何在C++项目中下载和使用JsonCpp库 #### 获取JsonCpp库 可以从JsonCpp的GitHub仓库获取该库。访问[open-source-parsers/jsoncpp](https://github.com/open-source-parsers/jsoncpp),这里提供了多种方式来集成JsonCpp到自己的项目当中[^1]。 #### 编译JsonCpp库 对于希望直接利用源码的方式,可以下载`jsoncpp-master.zip`压缩包中的源代码文件。解压之后,在特定路径下存在用于Visual Studio项目的解决方案文件(`jsoncpp.sln`),通过VS2008及以上版本打开此方案并编译,默认设置会创建静态链接库(.lib)[^3]。 另一种更为简便的方法是仅将`.h`头文件以及对应的实现文件(即`.cpp`)加入至个人工程项目内一同编译,这种方式不需要额外构建过程就能快速上手。 #### 配置开发环境 当采用预编译好的二进制形式时,则需确保包含了`include/json`目录下的所有必要头文件并且正确连接之前生成或下载获得的`.lib`静态库文件;如果是动态加载.so/dll的话还需要配置好运行期查找这些共享对象的位置。 #### 示例代码展示读取JSON数据 下面给出了一段简单的例用来说明怎样解析一个名为`package.json`的外部文件内容: ```cpp #include <iostream> #include <fstream> #include <jsoncpp/json/json.h> int main(){ std::ifstream ifs("package.json"); Json::Reader reader; Json::Value root; bool parsingSuccessful = reader.parse(ifs, root); if (!parsingSuccessful){ // 报告错误信息... return 1; } std::cout << "Name: " << root["name"].asString() << std::endl; return 0; } ``` 这段程序首先打开了指定名称的输入流,接着借助于`Json::Reader`类实例完成了解析操作并将结果存储到了`root`变量之中。最后打印出了键为"name"所关联字符串值[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值