Jsoncpp使用
1 简介
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
2 json数据类型
2.1 对象(词典)
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’对”之间使用“,”(逗号)分隔。
2.2 数组(列表)
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔。
2.3 字符串(string)
字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。字符串(string)与C或者Java的字符串非常相似。
2.4 数值(number)
Int
unsigned int;
2.4 bool值
true
、false
2.5 空
Null
值(value)可以是双引号括起来的字符串(string)、数值(number)、true
、false
、 null
、对象(object)或者数组(array)。这些结构可以嵌套。
3 jsoncpp基本语法
使用JsonCpp前先来熟悉几个主要的类:
Json::Value 可以表示里所有的类型,比如int,string,object,array等,具体应用将会在后边示例中介绍。
Json::Reader 将json文件流或字符串解析到Json::Value, 主要函数有Parse。
Json::Writer 与Json::Reader相反,将Json::Value转化成字符串流,注意它的两个子类:Json::FastWriter和Json::StyleWriter,分别输出不带格式的json和带格式的json。
3.1 Value
Json::Value是jsoncpp中最基本,最重要的类,用于表示各种类型的对象,jsooncpp支持的对象类型可见Json::ValueType枚举值。例:
Json::Value json_temp;
Json_temp[“name”] = Json::Value(“mingqi”);
Json[“key_array”].append(“array_string”);
3.2 Writer
如上说了Json::Value的使用方式,现在到了该查看刚才赋值内容的时候了,查看json内容,使用Writer类即可。
Jsoncpp的Json::Writer类是一个纯虚类,并不能直接使用。在此我们使用Json::Writer的子类:Json::FastWriter, Json::StyledWriter,Json::StyledStreamWriter。
顾名思义。用Json::FastWriter来处理json应该是最快的。
Json::FastWriter fast_writer;
cout<<"fastWriter:"<<fast_writer.write(root)<<endl;
用Json::StyledWriter是格式化后的json,下面我们来看看Json::StyledWriter是怎样格式化的。
Json::StyledWriter styled_writer;
cout<<"styleWriter:"<<styled_writer.write(root)<<endl;
3.3 Reader
Json::Reader是用于读取的,说的确切点,是用于将字符串转换为Json:Value对象的,下面我们来看个简单的例子:
stringstr=fast_writer.write(root);
Json::Reader reader;
Json::Value json_object;
if (! reader.parse(str, json_object)) {
cout<<"reader parsefailed"<<endl;
return 1;
}
cout<<"json_object:"<<json_object["k_item5Object"]["name"]<<endl;
3.4 完整例子
Json::Value json_item1;///对象
json_item1["name"] = Json::Value("mingqi");//字符串
json_item1["age"] = Json::Value(26);//整形
json_item1["is_stu"] = Json::Value(true);//bool
Json::Value root;//对象
root["k_item1Str"] = Json::Value("item1");
root["k_item2Int"] = Json::Value(123);
root["k_item3bool"] = Json::Value(false);
root["k_item4double"] = Json::Value(9.77);
root["k_item5Object"] = json_item1;//嵌套对象
root["k_item6Arr"].append("arr1");//数组
root["k_item6Arr"].append(78.9);
root["k_item6Arr"].append(true);
Json::ValueType type = root.type();
cout<<"root.type:"<<type<<endl;
// Json::FastWriter fast_writer;
//cout<<"FastWriter:"<<fast_writer.write(root)<<endl;
Json::FastWriter fast_writer;
cout<<"fastWriter:"<<fast_writer.write(root)<<endl;
Json::StyledWriter styled_writer;
cout<<"styleWriter:"<<styled_writer.write(root)<<endl;
string str=fast_writer.write(root);
Json::Reader reader;
Json::Value json_object;
if (! reader.parse(str, json_object)) {
cout<<"reader parsefailed"<<endl;
return 1;
}
cout<<"json_object:"<<json_object["k_item5Object"]["name"]<<endl;
json_object["name"]="wmq";
cout<<"fastWriter:"<<fast_writer.write(json_object)<<endl;
//遍历
Json::Value::Members mems=json_object.getMemberNames();
for(Json::Value::Members::iterator it=mems.begin(); it != mems.end();it++) {
string name = *it;
cout<<"key:"<<name<<"\tvalue:"<<json_object[name]<<endl;
if(json_object[name].isObject()) {
Json::Value::Membersmems=json_object[name].getMemberNames();
for(Json::Value::Members::iteratorit=mems.begin(); it != mems.end(); it++) {
string subName= *it;
cout<<"\t\tkey:"<<subName<<"\tvalue:"<<json_object[name][subName]<<endl;
}
} else if(json_object[name].isArray()){
Json::Value arrJson = json_object[name];
for (int i=0;i<json_object[name].size(); i++) {
cout<<"\t\t\tarr:"<<json_object[name][i]<<endl;
}
}
}