1. Jsoncpp简介
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C,C++,C#,Java, JavaScript,Python)。这些特性使得JSON成为理想的数据交换语言。
JSON构建于两种结构:
“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),记录(record),结构(struct),字典(dictionary)或者关联数组(associative array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持他们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为了可能。
2. Jsoncpp的数据格式
JSON具有以下这些数据形式:
对象是一个无序的“‘名称/值’对”集合。一个对象以{开始,}结束。每个名称后面跟一个“:”;“‘名称/值’对”之间使用“,”分隔。
{jack:56,mark:87}
数组是值的有序集合。一个数组以[开始,]结束。值之间使用“,”分隔。
[1,2,3]
值可以使双引号括起来的字符串、数值、true/false、null、对象或者数组。
字符串是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符即一个单独的字符串。字符串与C或者Java的字符串非常相似。
3. Jsoncpp中主要的类:
Json::Value: 可以表示所有支持的类型,如:int,double,string,object,array等。其包含节点的类型判断(isNull,isBool,isArray,isMember,isValidIndex等)。
Json::Reader: 将文件流或字符串解析到Json::Value中,主要使用parse函数。Json::Reader的构造函数还允许用户使用特性Features来定义Json的严格等级。
Json::Write:与JsonReader相反,将Json::Value转换成字符串流等,Writer类是一个纯虚类,并不能直接使用。在此我们使用Json::Writer的子类:Json::FastWriter(将数据写入一行,没有格式),Json::StyledWriter(按json格式化输出)
Json::Reader可以通过对Json源目标进行解析,得到一个解析好了的Json::Value,通常字符串或者文件输入流可以作为源目标。
如下Json文件:
{
“encoding”: ”UTF-8”,
“plug-ins”:[“python”,”c++”,”ruby”],
“indent”:{“length”:3,”use_space”:true},
“tab”:null
}
使用Json::Reader对Json文件进行解析:
Json::Value root;
Json::Reader reader;
std::ifstream ifs(“example.json”);//open file example.json
if(!reader.parse(ifs,root))
{
//fail to parse
}
else
{
//success
Std::cout<<root[“encoding”].asString()<<endl;
Std::cout<<root[“indent”][“length”].asInt()<<endl;
}
Json::Writer和Json::Reader相反,是把Json::Value对象写到string对象中,而且Json::Writer是个抽象类,被两个子类Json::FastWriter和Json::StyledWriter继承。
Json::Value root;
Json::Reader reader;
Json::FasterWriter fwriter;
Json::StyledWriter swriter;
If(!read.parse(“example.json”,root))
{
//parse fail
return 0;
}
std::string str = fwriter(root);
std::ofstream ofs(“example_fast_writer.json”);
ofs<<str;
ofs.close();
str=swriter(root);
ofs.open(“example_styled_writer.json”);
ofs<<str;
ofs.close()’