JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。在官方主页(中文)上有个简单的介绍(图比较形象),
jsoncpp是一个c++封装的json包,跨平台支持windows、linux、unix等多系统。官方提供的编译需要使用到scons(一个基于python语言编写的编译工具,类似于autoconfig等工具),0.5版本的需要python2.6的支持——坑爹啊。
反正有源码包,就自己改了个Makefile,编译生成了静态链接库libjsoncpp.a和动态链接库libjsoncpp.so。
关于json的教程,在sf主页http://jsoncpp.sourceforge.net/有详细的文档。
试用测试代码
View Code
#include <json/json.h>
#include <iostream>
int main()
{
Json::Value root;
Json::Value arrayObj;
Json::Value item;
for (int i=0; i<10; i++)
{
item["key"] = i;
arrayObj.append(item);
}
root["key1"] = "value1";
root["key2"] = "value2";
root["array"] = arrayObj;
root.toStyledString();
std::string out = root.toStyledString();
std::cout << out << std::endl;
}
该段代码输出的并没有涉及到json文件的解析。只是以json的格式显示出来。
简单的中文介绍参照博客 http://blog.csdn.net/vagrxie/archive/2010/07/22/5754179.aspx
下面演示如下读写(官方上也有介绍的哦)。代码如下
#include <json/json.h>
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
Json::Value value;
ifstream in("public.json");
string str;
string msg;
if(in.is_open())
{
while(in>>str)
msg += str;
}
Json::Reader reader;
int ret = reader.parse(msg,value);
if(ret)
{
string url = value["text"].asString();
string date = value["created_at"].asString();
cout<<value["privacy"].asInt()<<endl;
cout<<url<<"\t"<<date<<endl;
}
in.close();
return 0;
}
这段代码解析的digu的API返回的网页结果。可以正确输出。
但是digu API http://api.minicloud.com.cn/statuses/public_timeline.json返回的格式为无名数组。
那么又该如何解析呢?
参考代码如下
reader.parse(apiret,value);
for(int i = 0;i < value.size();++i)
{
string text = value[i]["text"].asString();
cout<<text<<endl;
}
json对数组的解析还支持STL的风格。即
Json::Value::Members member;//Members 这玩意就是vector<string>,typedef了而已
for (Json::Value::iterator itr = objArray.begin(); itr != objArray.end(); itr++)
{
member = (*itr).getMemberNames();
for (Json::Value::Members::iterator iter = member.begin(); iter != member.end(); iter++)
{
string str_temp = (*itr)[(*iter)].asString();
}
}
此种风格与上面的类似,只是上面的只是取"text"节点,而后一种是输出所有节点。