jsoncpp在linux和windows下的编译及使用详解
2017-07-18 22:39
429 查看
一:摘要
1. JSON是一种轻量级的数据传输格式,全称为:JavaScript Object Notation,官方网址:http://www.json.org/json-zh.html
3. JSONCPP是一个C++用来处理JSON格式数据的第三方库
二:说明
1. 本篇博客下载的是jsoncpp 0.5.0 版本,jsoncpp 0.5.0下载地址:http://download.csdn.net/detail/yzf279533105/9697182
2. 博客内容及所有代码均是在该版本下编译,运行,测试通过的,示例代码下载地址
windows下示例代码:http://download.csdn.net/detail/yzf279533105/9903065
linux下示例代码:http://download.csdn.net/detail/yzf279533105/9915877
三. Windows下的编译
1. 从上面的地址下载得到jsoncpp-src-0.5.0.tar.gz文件,解压得到jsoncpp-src-0.5.0文件夹
2. 进入目录 jsoncpp-src-0.5.0/makefiles/vs71,打开解决方案jsoncpp.sln(注意vs71也就是VS2003,如果你的VS版本较高,默认转换即可,不会出什么问题)
3. 该解决方案中有三个工程,分别为jsontest,lib_json,test_lib_json
4. 不需任何操作,直接编译工程lib_json,默认是Debug版,该工程为静态库文件工程,最终产生lib文件,产生的库文件为json_vc71_libmtd.lib,全路径为:jsoncpp-src-
0.5.0/build/vs71/debug/lib_json/json_vc71_libmtd.lib,注意产生库文件名字中的 "mtd"字样,这个是编译参数,说明编译的是多线程调试版,mtd的意思即Multi Debug,。当然你也可以编译release版
四. Windows下的使用
1. 切记:示例工程所用的Visual Studio和步骤三的编译库所用的Visual Studio 是同一版本。如果两次所用VS的版本不同,链接静态库时很可能会出现链接错误,笔者已踩过此坑)
2. 建立一个空的win32控制台工程,类似HellowWorld的工程即可,我这里工程命名为jsoncppExample
3. 在本示例工程根目录添加include文件夹,把jsoncpp-src-0.5.0/include/json文件夹整个拷贝到include下面,在属性页 配置属性 -> C/C++ -> 常规 -> 附加包含目录 中设置该工程的头文件目录,即“../include”
4. 在本示例工程根目录添加lib文件夹,把刚才编译的json静态库拷贝到lib下面,即上面的库文件json_vc71_libmtd.lib,在属性页 配置属性 -> 链接器 -> 常规 -> 附加库目录 中设置该工程
的静态库目录,即“../lib”;在属性页 配置属性 -> 链接器 -> 输入 -> 附加依赖项 中设置该工程的静态库的名字,即“json_vc71_libmtd.lib”
5. 在属性页 配置属性 -> C/C++ -> 代码生成 -> 运行时库 中设置为“多线程调试(/MTd)”,即和上面编译库时的选项一致
6. 添加一个源文件main.cpp,代码如下:
五. Linux下的编译
1. 在linux下编译jsoncpp需要使用scons,一个类似make的编译工具。安装scons需要pyhon,centos系统自带python,如果没有请自行安装,这个简单,注意pyhon版本需为2.7或者以下
2. 安装scons,下载地址http://download.csdn.net/detail/yzf279533105/9915884。笔者这里是下载到/home/scons/ 目录下。进入目录 /home/scons/,执行解压缩命令 tar
-zxvf scons-2.5.1.tar.gz。设置两个环境变量 export MYSCONS=/home/scons/scons-2.5.1 ,export SCONS_LIB_DIR=$MYSCONS/engine 。这两个环境变量至关重要
3. 编译jsoncpp,笔者这里是下载到/home/jsoncpp/ 目录下。进入目录 /home/jsoncpp/,执行解压缩命令 tar -zxvf jsoncpp
b532
-src-0.5.0.tar.gz,再进入目录 /home/jsoncpp/jsoncpp-src-0.5.0/,执行编译命令 python $MYSCONS/script/scons platform=linux-gcc,即可编译jsoncpp,随后会生成静态库和动态库文件,在目录jsoncpp-src-0.5.0/libs/linux-gcc-4.4.7中。分别是静态库libjson_linux-gcc-4.4.7_libmt.a,动态库libjson_linux-gcc-4.4.7_libmt.so
六. Linux下的使用
1. 代码与步骤四中windows下的代码完全相同,需编写makefile,示例代码中有
2. Linux下示例代码下载地址:http://download.csdn.net/detail/yzf279533105/9915877
1. JSON是一种轻量级的数据传输格式,全称为:JavaScript Object Notation,官方网址:http://www.json.org/json-zh.html
3. JSONCPP是一个C++用来处理JSON格式数据的第三方库
二:说明
1. 本篇博客下载的是jsoncpp 0.5.0 版本,jsoncpp 0.5.0下载地址:http://download.csdn.net/detail/yzf279533105/9697182
2. 博客内容及所有代码均是在该版本下编译,运行,测试通过的,示例代码下载地址
windows下示例代码:http://download.csdn.net/detail/yzf279533105/9903065
linux下示例代码:http://download.csdn.net/detail/yzf279533105/9915877
三. Windows下的编译
1. 从上面的地址下载得到jsoncpp-src-0.5.0.tar.gz文件,解压得到jsoncpp-src-0.5.0文件夹
2. 进入目录 jsoncpp-src-0.5.0/makefiles/vs71,打开解决方案jsoncpp.sln(注意vs71也就是VS2003,如果你的VS版本较高,默认转换即可,不会出什么问题)
3. 该解决方案中有三个工程,分别为jsontest,lib_json,test_lib_json
4. 不需任何操作,直接编译工程lib_json,默认是Debug版,该工程为静态库文件工程,最终产生lib文件,产生的库文件为json_vc71_libmtd.lib,全路径为:jsoncpp-src-
0.5.0/build/vs71/debug/lib_json/json_vc71_libmtd.lib,注意产生库文件名字中的 "mtd"字样,这个是编译参数,说明编译的是多线程调试版,mtd的意思即Multi Debug,。当然你也可以编译release版
四. Windows下的使用
1. 切记:示例工程所用的Visual Studio和步骤三的编译库所用的Visual Studio 是同一版本。如果两次所用VS的版本不同,链接静态库时很可能会出现链接错误,笔者已踩过此坑)
2. 建立一个空的win32控制台工程,类似HellowWorld的工程即可,我这里工程命名为jsoncppExample
3. 在本示例工程根目录添加include文件夹,把jsoncpp-src-0.5.0/include/json文件夹整个拷贝到include下面,在属性页 配置属性 -> C/C++ -> 常规 -> 附加包含目录 中设置该工程的头文件目录,即“../include”
4. 在本示例工程根目录添加lib文件夹,把刚才编译的json静态库拷贝到lib下面,即上面的库文件json_vc71_libmtd.lib,在属性页 配置属性 -> 链接器 -> 常规 -> 附加库目录 中设置该工程
的静态库目录,即“../lib”;在属性页 配置属性 -> 链接器 -> 输入 -> 附加依赖项 中设置该工程的静态库的名字,即“json_vc71_libmtd.lib”
5. 在属性页 配置属性 -> C/C++ -> 代码生成 -> 运行时库 中设置为“多线程调试(/MTd)”,即和上面编译库时的选项一致
6. 添加一个源文件main.cpp,代码如下:
#include <iostream> #include <fstream> #include "json/json.h" using namespace std; int main() { /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////// json Value的新建及key的访问 /////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// cout<<"json Value的新建及key的访问"<<endl; // 新建Json::Value对象 Json::Value value1; // 给字段赋值,key必须为string型 // 类似STL的map,访问一个不存在的字段时会自动新建一个字段 value1["name"] = "英语"; // string型 Json::Value value2; value2["name"] = "语文"; // string型 value2["score"] = 80; // 整型 value2["right"] = true; // bool型 value2["percent"] = 12.34567890; // double型 value2["count"]; // 单纯的访问一个key,由于该key不存在,所以会新建,值的类型为Json::nullValue // 新建Value对象 Json::Value valueArr; valueArr["name"] = "json array"; // string型 valueArr["object"] = value1; // json::Value型 valueArr["array"].append("array_element_one"); // 访问key为"array",该key不存在,会新建,类型为Json::arrayValue,数组型,且把第一个元素赋值为string型"array element one" valueArr["array"].append("array_element_two"); // 该key已存在,往后面增加元素,赋值为string型"array element two" valueArr["array"].append(33333); // 该key已存在,往后面增加元素,赋值为整型33333 valueArr["array"].append(value2); // 该key已存在,往后面增加元素,赋值为json::Value型 // 计算其中字段的个数 cout<<"size = "<<valueArr.size()<<endl; // key的访问 // 访问字段"object"的值,访问一个key前,先预判 if (valueArr.isMember("object")) // 根据前面:"object"的值是Json::Value类型的 { // 存在的话,再判断其value的类型是否是自己预期的 if (valueArr["object"].isObject()) { // 转换成对应的类型 Json::Value object = valueArr["object"]; // 字段检测,取值 if (object.isMember("name") && object["name"].isString()) { string name = object["name"].asString(); cout<<"valueArr[object] key = name, value = "<< name.c_str()<<endl; } } } // 访问字段"array"的值 if (valueArr.isMember("array") && valueArr["array"].isArray()) // 根据前面:"object"的值是Json::arrayValue类型的 { Json::Value arrayObject = valueArr["array"]; // 得到其元素个数 int array_size = arrayObject.size(); // 根据类型,逐个输出元素 for(int i=0; i<array_size; i++) { // Json::Value型 if (arrayObject[i].isObject()) { // 转换成对应的类型 Json::Value object = arrayObject[i]; // 字段检测,取值 if (object.isMember("score") && object["score"].isInt()) { int score = object["score"].isInt(); cout<<"valueArr[array][" << i <<"]" << " key = score, value = "<< score<<endl; } // 字段检测,取值 if (object.isMember("percent") && object["percent"].isDouble()) { double percent = object["percent"].isDouble(); cout<<"valueArr[array][" << i <<"]" << " key = percent, value = "<< percent<<endl; } } // string类型 if (arrayObject[i].isString()) { cout<<"valueArr[array][" << i <<"] value is " << arrayObject[i].asString()<<endl; } // 整型 if (arrayObject[i].isInt()) { cout<<"valueArr[array][" << i <<"] value is " << arrayObject[i].asInt()<<endl; } } } cout<<"\n\n"<<endl; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////// 把Json::Value转换成字符串 ////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// cout<<"把Json::Value转换成字符串"<<endl; cout<<valueArr.toStyledString()<<endl; cout<<"\n\n"<<endl; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////// 从字符串中解析出json::Value ////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// cout<<"从字符串中解析出json::Value"<<endl; // 要解析的json字符串 std::string strValue = "{\"key1\":\"value1\",\"array\":[{\"key2\":\"value2\"},{\"key2\":999},{\"key2\":\"value4\"}]}"; // json对象 Json::Value value3; // 开始解析json,解析后的json对象存储在value中,成功返回true Json::Reader reader; if (reader.parse(strValue, value3)) { // 字段key1 if (value3.isMember("key1") && value3["key1"].isString()) { cout<<"value3[key1] = "<<value3["key1"].asString()<<endl; } // 字段array if (value3.isMember("array") && value3["array"].isArray()) { Json::Value valueArray = value3["array"]; for (int i=0; i<valueArray.size(); i++) { if (valueArray[i].isObject() && valueArray[i].isMember("key2") && valueArray[i]["key2"].isString()) { cout<<"value3[array]["<<i<<"].[key2] = "<<valueArray[i]["key2"].asString()<<endl; } if (valueArray[i].isObject() && valueArray[i].isMember("key2") && valueArray[i]["key2"].isInt()) { cout<<"value3[array]["<<i<<"].[key2] = "<<valueArray[i]["key2"].isInt()<<endl; } } } } cout<<"\n\n"<<endl; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////// 把json::Value写入到文件中 ////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// cout<<"把json::Value写入到文件中"<<endl; ofstream ofs; ofs.open("test.json"); // 第一种办法:直接输出,带缩进,效果等同于第三种办法 //ofs << valueArr.toStyledString(); // 第二种办法:快速输出,没有格式 //Json::FastWriter fw; //ofs<<fw.write(valueArr)<<endl; // 第三种办法:缩进输出 Json::StyledWriter sw; ofs<<sw.write(valueArr)<<endl; ofs.close(); cout<<"输出到文件完毕"<<endl; cout<<"\n\n"<<endl; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////// 从文件中读取json::Value ////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// cout<<"从文件中读取到json:value"<<endl; ifstream ifs; ifs.open("test.json"); Json::Value value4; Json::Reader jsonReader; if (jsonReader.parse(ifs, value4)) { // 得到字段的个数 cout<<"size = "<<value4.size()<<endl; // 访问 if (valueArr.isMember("name") && valueArr["name"].isString()) { cout<<"valueArr[name] = "<<valueArr["name"].asString()<<endl; } } getchar(); return 0; }
五. Linux下的编译
1. 在linux下编译jsoncpp需要使用scons,一个类似make的编译工具。安装scons需要pyhon,centos系统自带python,如果没有请自行安装,这个简单,注意pyhon版本需为2.7或者以下
2. 安装scons,下载地址http://download.csdn.net/detail/yzf279533105/9915884。笔者这里是下载到/home/scons/ 目录下。进入目录 /home/scons/,执行解压缩命令 tar
-zxvf scons-2.5.1.tar.gz。设置两个环境变量 export MYSCONS=/home/scons/scons-2.5.1 ,export SCONS_LIB_DIR=$MYSCONS/engine 。这两个环境变量至关重要
3. 编译jsoncpp,笔者这里是下载到/home/jsoncpp/ 目录下。进入目录 /home/jsoncpp/,执行解压缩命令 tar -zxvf jsoncpp
b532
-src-0.5.0.tar.gz,再进入目录 /home/jsoncpp/jsoncpp-src-0.5.0/,执行编译命令 python $MYSCONS/script/scons platform=linux-gcc,即可编译jsoncpp,随后会生成静态库和动态库文件,在目录jsoncpp-src-0.5.0/libs/linux-gcc-4.4.7中。分别是静态库libjson_linux-gcc-4.4.7_libmt.a,动态库libjson_linux-gcc-4.4.7_libmt.so
六. Linux下的使用
1. 代码与步骤四中windows下的代码完全相同,需编写makefile,示例代码中有
2. Linux下示例代码下载地址:http://download.csdn.net/detail/yzf279533105/9915877
相关文章推荐
- tinyxml在linux和windows下的编译及使用详解
- Boost下载安装编译配置使用指南(含Windows和Linux)
- Boost下载安装编译配置使用指南(含Windows和Linux)
- Boost下载安装编译配置使用指南(含Windows和Linux)
- 内存详解——理解 JVM 如何使用 Windows 和 Linux 上的本机内存
- 【原】Boost下载安装编译配置使用指南(含Windows、Linux以及ARM Linux)
- Boost 下载安装编译配置使用指南(含Windows和Linux)
- Boost下载安装编译配置使用指南(含Windows和Linux)
- Boost下载安装编译配置使用指南(含Windows和Linux)
- 【原】Boost下载安装编译配置使用指南(含Windows和Linux)
- [转载] Boost下载安装编译配置使用指南(含Windows、Linux以及ARM Linux)
- 内存详解——理解 JVM 如何使用 Windows 和 Linux 上的本机内存
- 编译hadoop1.04 eclipse plugin插件 详解 在windows linux平台均可
- Boost下载安装编译配置使用指南(含Windows和Linux)
- Boost下载安装编译配置使用指南(含Windows和Linux)
- Boost下载安装编译配置使用指南(含Windows和Linux)
- 小笔记,在windows和linux下分开编译、在C\C++下都使用C风格编译
- Boost下载安装编译配置使用指南(含Windows和Linux)
- Boost下载安装编译配置使用指南(含Windows、Linux以及ARM Linux)
- Boost下载安装编译配置使用指南(含Windows和Linux)