Linux环境下 C++ jsoncpp编译和使用

一.下载源代码并编译

        使用cmake工具。

        安装例子:apt-get install cmake

git clone https://github.com/open-source-parsers/jsoncpp.git

cd jsoncpp

mkdir -p build

cd build

cmake -DCMAKE_BUILD_TYPE=release -DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=OFF -DARCHIVE_INSTALL_DIR=. -G "Unix Makefiles" ..

make

# 安装或者不安装都没必要
# sudo make install

在jsoncpp/build/bin生成了测试elf:jsoncpp_test

在jsoncpp/build/lib生成了库:libjsoncpp.a

头文件目录   jsoncpp/include

调用./jsoncpp_test

这里就基本编译完成了

二.使用实例

简单的格式校验工具:

在同个jsoncpp的目录下,创建目录jsonchecktool,并进入其目录

mkdir -p jsonchecktool
cd jsonchecktool

编写Makefile文件

vim Makefile

内容如下:

all:jsonchecktool
jsonchecktool: jsonchecktool.cpp
	g++ jsonchecktool.cpp -L ../jsoncpp/build/lib -ljsoncpp -I ../jsoncpp/include -o jsonchecktool

test:jsonchecktool
	echo 测试 ok.json
	./jsonchecktool ok.json ok.format.json
	echo 测试 error.json
	./jsonchecktool error.json

clean:
    rm jsonchecktool

c++的代码文件:jsonchecktool.cpp

内容如下:

#include <iostream>
#include <fstream>
#include <string>
#include <json/json.h>

using namespace std;
using Json::Reader;
using Json::Value;
using Json::String;
using Json::StyledWriter;

int main(int len, const char *argv[]) {
    if(len<2){
        printf("E: 语法错误\n");
        printf("I: 语法: ./jsonchecktool <json源文件> [json的目标文件]\n");
        exit(-1);
    }
    ifstream ifs(argv[1]);
    Reader reader;
    Value obj;
    reader.parse(ifs, obj); // reader can also read strings
    // 检测json的读是否异常
    if (!reader.good()) {
        // 异常
        String errInfo = reader.getFormattedErrorMessages();
        cout<<"E: json检验不通过!!!"<<endl;
        cout<<errInfo<<endl;
        exit(0);
    } else {
        // 正常,格式化输出,后缀名: .format.json
        const char * outFilePath = nullptr;
        if(len>2) outFilePath = argv[2];
        else {
            // 文件路径一般不能超过256长度的
            char * outFilePathT = new char[256+20];
            sprintf(outFilePathT, "%s/.format.json", argv[1]);
            outFilePath = outFilePathT;
        }
        //输出带格式的字符串
        StyledWriter sw;
        ofstream os;
        os.open(outFilePath, ios::out);
        if (!os.is_open()) {
            cout << "can not find or create file:"<< outFilePath << endl;
            if(len<=2) delete[] outFilePath;
            exit(-1);
        }
        os << sw.write(obj);
        os.close();
        cout<<"I: json检验通过!!!"<<endl;
        cout<<"I: 格式化输出文件:"<<outFilePath<<endl;
        if(len<=2) delete[] outFilePath;
    }
}

编译工具代码:

make

生成了文件: jsonchecktool

三.测试和使用json的校验工具

编写正常的json的文件:ok.json

{
   "age" : "20",
   "classmate" : [
      {
         "age" : "20",
         "name" : "lisi",
         "sex" : "male"
      },
      {
         "age" : "20",
         "name" : "wangwu",
         "sex" : "male"
      }
   ],
   "course" : [ "math", "english", "chiness" ],
   "name" : "zhangsan",
   "sex" : "male"
}

编写错误的json文件:err.json

{
   "age" : "20",
   "classmate" : [
      {
        "age": "20"
        [],
         "name" : "lisi",
         "sex" : "male"
      },
      {
         "age" : "20",
         "name" : "wangwu",
         "sex" : "male"
      }
   ],
   "course" : [ "math", "english", "chiness" ],
   "name" : "zhangsan",
   "sex" : "male"
}

测试指令:

make test

结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值