转自:http://my.oschina.net/renhc/blog/32880
JSON 官方的解释为:JSON 是一种轻量级的数据传输格式。
关于 JSON 更具体的信息,可参见 JSON 官网:http://www.json.org。
jsoncpp 是比较出名的 C++ JSON 解析库。在 JSON 官网也是首推的。
下载地址为:http://sourceforge.net/projects/jsoncpp。
下面开始说明配置方法:
1、jsoncpp下载后需要编译成链接库(也可以不编译,把所有.cpp .h文件加入到自己的工程中。这种方法不易管理,不推荐),
编译jsoncpp需要使用scons。那么先下载scons。(http://www.scons.org/)
2、scons部署(版本为scons-2.1.0.zip)
进入scons解压目录(假定为$MYSCONS),执行python $MYSCONS/setup.py install , 将scons部署完毕。
3、使用scons编译jsoncpp(版本为jsoncpp-src-0.5.0.tar.gz)
进入jsoncpp解压目录,执行命令:python $MYSCONS/script/scons.py platform=linux-gcc
将jsoncpp编译,在解压目录jsoncpp-src-0.5.0/libs/linux-gcc-3.4.6下可以看到生成了两个文件:
libjson_linux-gcc-3.4.6_libmt.a
libjson_linux-gcc-3.4.6_libmt.so
修改环境变量LD_LIBRARY_PATH,将该库所在的目录加入。
4、将jsoncpp目录下的头文件件拷到自己的工程里就可以使用了。
注意在编译里指定动态链接库的地址。-L/jsoncpp-src-0.5.0/libs/linux-gcc-3.4.6/ -ljson_linux-gcc-3.4.6_libmt
例子代码:
#include <iostream>
#include <string>
#include "json/json.h"
int main(void)
{
Json::Value root;
Json::FastWriter fast_writer;
root["REGION_ID"] = "600901";
root["DATA_TOTAL_NUM"] = "456278";
std::cout << fast_writer.write(root) << std::endl;
return 0;
}
输出:{"DATA_TOTAL_NUM":"456278","REGION_ID":"600901"}
Linux 下编译JsonCpp——ZT
转自:http://hi.baidu.com/%B4%AB%CB%B5%D6%D0%B5%C4%C8%CC%D5%DF%C3%A8/blog/item/a6eb970c98a644d67acbe15a.html
安装JsonCpp需要下载JsonCpp和Scon还需要机器上有python
wget http://sourceforge.net/projects/jsoncpp/files/latest/download?_test=goal 下载JsonCpp
wget http://sourceforge.net/projects/scons/files/scons/2.1.0/scons-2.1.0.tar.gz/download 下载scons-2.1.0
scons又是一个牛叉的工具,功能和GNU make一样,又比make简单多了。scons是python工具,需要先安装好python。
下载scons 在这里http://www.scons.org/
解压 tar -zxvf scons-2.0.1.tar.gz
设定环境变量
# export MYSCONS=解压的路径
# export SCONS_LIB_DIR=$MYSCONS/engine
开始编译jsoncpp
# cd jsoncpp-src-0.5.0
# python $MYSCONS/script/scons platform=linux-gcc
注释:网上有一些错误的 也可能是早期的版本 # python $MYSCONS/script/scons.py platform=linux-gcc
经过测试 发现报错 查看路径下 没有scons.py文件 故改为scons
之后编译
生成静态和动态库文件
在jsoncpp-src-0.5.0/libs/linux-gcc-4.1.2目录下
libjson_linux-gcc-4.4.4_libmt.a
libjson_linux-gcc-4.4.4_libmt.so
使用时 需要把头文件 即 include下的文件复制到工程下
-------------------------------------------------
使用示例
#include "json/json.h"
#include <string>
#include <iostream>
using namespace std;
int main()
{
string test ="{\"id\":1,\"name\":\"kurama\"}";
Json::Reader reader;
Json::Value value;
if(reader.parse(test,value))
{
if(!value["id"].isNull())
{
cout<<value["id"].asInt()<<endl;
cout<<value["name"].asString()<<endl;
}
}
return 0;
}
编译 为了方便编译 我将静态库文件命名为libjson-0.5.0.a
建立一个新的文件夹json-test 把libjson-0.5.0.a 复制过去
mv /jsoncpp-src-0.5.0/include/json/ json-test/
g++ -o main main.cpp -L. -ljson-0.5.0
就可以了~~
-------------------------------------------------------------------------------
示例demo:
Json::Value 表示一个json值对象,后面会频繁用到
Json::Reader read对象,用来解析josn字符串,有reader就有writer -- Json::Writer
假设有这么个json字符串,这里主要讲一下带数组这种的串,象最简单的{"key":"value"}就不讲了 - -
string strJson = "{\"key1\":\"value1\",\"array\":[{\"key2\":\"value2\",\"key3\":\"aa\"},{\"key2\":\"value3\",\"key3\":\"bb\"},{\"key2\":\"value4\",\"key3\":\"cc\"}]}";
一种方法:
Json::Reader reader;
Json::Value val;
if(!reader.parse(strJson,val))
return -1;
std::string str = val["key1"].asString();
Json::Value obj_array = val["array"];
for (int i = 0; i< obj_array.size(); i++)
{
str = obj_array[i]["key2"].asString();
str = obj_array[i]["key3"].asString();
}
一次for循环就全部解析出来了
另一种,用他内建的迭代器,其实也就是他自己的一个vector<string>成员,可以自己去看json:value的定义
Json::Value::Members member;//Members 这玩意就是vector<string>,typedef了而已
for (Json::Value::iterator itr = obj_array.begin(); itr != obj_array.end(); itr++)
{
member = (*itr).getMemberNames();
for (Json::Value::Members::iterator iter = member.begin(); iter != member.end(); iter++)
{
string str_temp = (*itr)[(*iter)].asString();
}
}
-------------------------------------------------------------
示例demo:
JSONCPP的应用例子。
#include "json.h"
#include <string>
using namespace std;
int Parse()
{
std::string strValue = "{\"key1\":\"value1\",\"array\":[{\"key2\":\"value2\"},{\"key2\":\"value3\"},{\"key2\":\"value4\"}]}";
Json::Reader reader;
Json::Value value;
if (reader.parse(strValue, value))
{
std::string out = value["key1"].asString();
std::cout << out << std::endl;
const Json::Value arrayObj = value["array"];
for (int i=0; i<arrayObj.size(); i++)
{
out = arrayObj[i]["key2"].asString();
std::cout << out;
if (i != arrayObj.size() - 1 )
std::cout << std::endl;
}
}
std::cout << std::endl << std::endl << std::endl;
return 0;
}
int Build()
{
Json::Value root;
root["key1"] = "value1";
root["key2"] = "value2";
Json::Value arrayObj;
Json::Value item;
for (int i=0; i<10; i++)
{
item["key"] = i;
arrayObj.append(item);
}
root["array"] = arrayObj;
root.toStyledString();
std::string out = root.toStyledString();
std::cout << out << std::endl;
return 0;
}
void main()
{
Parse();
Build();
system("pause");
}