一:摘要
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已存在,往后面增加元素,赋值为整型33333valueArr["array"].append(value2);              // 该key已存在,往后面增加元素,赋值为json::Value型// 计算其中字段的个数cout<<"size = "<<valueArr.size()<<endl;// key的访问// 访问字段"object"的值,访问一个key前,先预判是否有该keyif (valueArr.isMember("object")){// 存在的话,再判断其value的类型是否是自己预期的,根据前面32行赋值代码可知:"object"的值是Json::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()) // 根据前面33行赋值代码可知:"object"的值是Json::arrayValue类型的{// 注意:虽然类型为Json::arrayValue,也是转换为Json::Value类型的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"].asInt();cout<<"valueArr[array][" << i <<"]" << " key = score, value = "<< score<<endl;}// 字段检测,取值if (object.isMember("percent") && object["percent"].isDouble()){double percent = object["percent"].asDouble();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中,成功返回trueJson::Reader reader;if (reader.parse(strValue, value3)){       // 字段key1if (value3.isMember("key1") && value3["key1"].isString()){cout<<"value3[key1] = "<<value3["key1"].asString()<<endl;}// 字段arrayif (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"].asInt()<<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-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

jsoncpp在linux和windows下的编译及使用详解相关推荐

  1. tinyxml在linux和windows下的编译及使用详解

    一:摘要 1.XML全称EXtensible Markup Language,翻译为可扩展标记语言,XML文件通常就是一个文本文件,可以使用任何编码 2.TinyXML是一个开源的C++用来处理XML ...

  2. Linux下Nginx编译安装过程详解

    Linux下Nginx编译安装过程详解 一.Nginx介绍 二.Nginx源码下载 1.打开Nginx官网 2.下载官网的源码包 三.Nginx源码安装 1.解压源码包 2.安装开发包组及环境 3.编 ...

  3. c语言path环境变量,Windows下PATH等环境变量详解(转载)

    在学习JAVA的过程中,涉及到多个环境变量(environment variable)的概念,如PATH.正确地配置这些环境变量,是能够顺利学习.开发的前提.而经常出现的问题是:有的学习者能够按照提示 ...

  4. Boost在Linux和windows下的编译 32位 64位

    一 简言 1. Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一 2. Boost官网地址:http://www.boost.org/ 3. 本博客示 ...

  5. VLC-3.0.0(Nightly版)在Linux和Windows下的编译步骤详解

    VLC 3.0.0 Compile vlc的编译一直是个大坑,做过音视频开发的不少人想必都踩过,开篇引用官方wiki一句话: Compiling VLC is not an easy task. 本文 ...

  6. Linux 挂载windows网络共享文件 /etc/fstab功能详解

    转载自: http://www.cnblogs.com/qiyebao/p/4484047.html Linux命令-自动挂载文件/etc/fstab功能详解[转] 一./etc/fstab文件的作用 ...

  7. 【学习笔记】编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译

    本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录,就可以发现源码目录及其子目录中有很多的KConfig文件和Makefile文件.这些文件什么作用呢?正是这些文件组成了Linux ...

  8. 编译arm linux内核,编译Linux内核(下)---KConfig、Makefile详解以及ARM平台Linux内核的编译...

    转载自:http://blog.csdn.net/newthinker_wei/article/details/8022696 本文主要介绍Linxu2.6的内核配置系统. 如果你浏览一下源代码目录, ...

  9. Windows下VTK6.0.0安装详解(CMake使用说明)

    操作系统:Windows7,用到工具:Visual studio.CMake. 1.准备工作 VTK下载: 下载最新VTK稳定版(6.0.0,截至2013年7月)http://www.vtk.org/ ...

最新文章

  1. 针对抓win2003系统密码的诡计
  2. linux如何添加route,Linux主机添加路由 route(示例代码)
  3. Visual Studio 2008 使用小技巧
  4. ndows live id怎么登陆,手机如何注册和使用Windows Live ID帐号
  5. 存储过程没有执行完后没有释放锁_【大厂面试07期】说一说你对synchronized锁的理解?...
  6. java面试题之hashCode与equals()方法
  7. 跑山么、后浪们?2.0T+237匹大马力后驱CT4山路试驾体验
  8. Ibatis SqlMapclient对象
  9. 如何通过Multitouch为Mac电脑添加更多手势控制?
  10. android 9 one ui,终于!三星S9系列国行开测安卓9.0系统:OneUI真香!
  11. unity 确定与取消对话框
  12. 服务器间文件拷贝显示busy,网站解决和优化Server is too busy的一些方法
  13. mysql数据库应用试卷代号3868_实用数据库期末试卷B卷答题纸
  14. 2020西工大计算机考研经验贴
  15. 【Python-Anaconda】jupyter notebook运行代码时出现异常——代码前面的[ ]中为空,跳转下一行,显示自动保存失败。面对这种情况该如何解决?
  16. hDC转PostScript转PDF
  17. 简信CRM:超实用的移动CRM选型参考指南
  18. 微信小程序:去水印工具微信小程序源码
  19. Windows Server 创建域、加入域、域管理
  20. CentOS中 DNF 和 Yum 的区别

热门文章

  1. 中石油训练赛 - Count the Even Integers(Java高精度运算+找规律)
  2. HDU - 6602 Longest Subarray(线段树+思维)
  3. 洛谷 - P1251 餐巾计划问题(最小费用最大流+思维建边)
  4. uva437The Tower of Babylon
  5. Python第三方包-你了解numpy吗(numpy基础)
  6. 像烟灰一样松散(毕淑敏)
  7. 视频码率,帧率和分辨率的区别
  8. QUIC报文格式详解
  9. 知乎热榜:如何获得高并发的经验?
  10. 科普 | 微服务和软件技术栈