JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org,本文不再对json做介绍,将重点介绍c++的json解析库的使用方法。json官网上列出了各种语言对应的json解析库,作者仅介绍自己使用过的两种C++的json解析库:jsoncpp(v0.5.0)和Boost(v1.34.0)。
使用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。
主要包括:从字符串解析,从文件解析,写入文件,读取文件,输出json,读取json等!
环境配置:将解压下的库,头文件和lib添加到指定的位置(可以工程文件夹也可以是环境变量中);
编写 Makefile文件
测试文件和测试代码
测试文件:test.json
{
"uploadid": "UP000000",
"code": "0",
"msg": "",
"files":
[
{
"code": "0",
"msg": "",
"filename": "1D_16-35_1.jpg",
"filesize": "196690",
"width": "1024",
"height": "682",
"images":
[
{
"url": "fmn061/20111118",
"type": "large",
"width": "720",
"height": "479"
},
{
"url": "fmn061/20111118",
"type": "main",
"width": "200",
"height": "133"
}
]
}
]
}
测试代码:
#include <json/json.h>
#include <string>
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
//返回字符串的长度
//int getjson(char * buf, string * root)
int getjson(char * buf, string * root)
{
int len = sizeof(*root) ;
memcpy(buf,root,len);
//cout << "buf:"<< buf <<endl;
printf("%s", buf);
return len;
}
int ParseJsonFromFile(const char* filename)
{
printf("mingming\n");
// 解析json用Json::Reader
Json::Reader reader;
// Json::Value是一种很重要的类型,可以代表任意类型。如int, string, object, array...
Json::Value root;
std::ifstream is;
is.open (filename, std::ios::binary );
if( !is.is_open() )
{
cout << "Error opening file\n";
return -1;
}
cout << is <<endl ;
if (reader.parse(is, root))
{
std::string code;
if (!root["files"].isNull()) // 访问节点,Access an object value by name, create a null member if it does not exist.
code = root["uploadid"].asString();
cout << code <<endl;
// 访问节点,Return the member named key if it exist, defaultValue otherwise.
code = root.get("uploadid", "null").asString();
cout << code <<endl;
// 得到"files"的数组个数
int file_size = root["files"].size();
// 遍历数组
for(int i = 0; i < file_size; ++i)
{
Json::Value val_image = root["files"][i]["images"];
int image_size = val_image.size();
for(int j = 0; j < image_size; ++j)
{
std::string type = val_image[j]["type"].asString();
cout << "type" << ":"<<type <<endl;
std::string url = val_image[j]["url"].asString();
cout << "url" << ":"<< url <<endl;
}
}
}
is.close();
return 5;
}
//
int main()
{ int i;
char buf[100];
//从文件读取json流
ParseJsonFromFile("./test.json");
//jie xi zifuchuan
string test ="{\"id\":1,\"name\":\"kurama\"}";
/*if(reader.parse(test,value))
{
if(!value["id"].isNull())
{
cout << value["id"].asInt() <<endl;
cout << value["name"].asString()<<endl;
}
}*/
//创建json字符串对象
Json::Value root;
root["lUserID"] = Json::Value(1);
root["name"] = Json::Value("jiaojiao");
//std::cout << root <<endl;
Json::StyledWriter my_writer;
Json::FastWriter my_fwriter;
//输出json
std::string ss = my_fwriter.write(root);
std::cout << root <<endl;
std::cout << ss <<endl;
std::cout << "length:" << ss.length() <<endl;
Json::Reader reader;
Json::Value myvalue;
//直接引用对象的数据
cout << root["lUserID"].asInt() <<endl;
//shu chu json
//解析字符串对象
if(reader.parse(ss, myvalue))
{
cout << myvalue["lUserID"].asInt() <<endl;
cout << myvalue["name"].asString()<<endl;
}
/* //直接输出
cout << "FastWriter:" << endl;
Json::FastWriter fw;
cout << fw.write(root) << endl << endl;
//缩进输出(格式化输出)
cout << "StyledWriter:" << endl;
Json::StyledWriter sw;
cout << sw.write(root) << endl << endl; */
//输出到文件
Json::StyledWriter sw;
ofstream os;
os.open("./demo.json");
os << sw.write(root);
os.close();
///////////////////////////
i = getjson( buf, &ss);
cout << i <<endl;
Json::Reader reader0;
Json::Value myvalue0;
cout << "haha" << buf <<endl;
//shu chu json
//解析字符串对象
if(reader0.parse(buf, myvalue0))
{
cout << myvalue0["lUserID"].asInt() <<endl;
cout << myvalue0["name"].asString()<<endl;
}
return 0;
}
出现乱码:
mingming
0x7ffd2f1f9b80
UP000000
UP000000
type:large
url:fmn061/20111118
type:main
url:fmn061/20111118
{
"lUserID" : 1,
"name" : "jiaojiao"
}
{"lUserID":1,"name":"jiaojiao"}
length:32
1
1
jiaojiao
****
{"lUserID":1,"name":"jiaojiao"}
�#****
�#
32
haha�#
修改程序:用 c_str( )函数将string 对象转换成 char *风格的字符串
#include <json/json.h>
#include <string>
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
//返回字符串的长度
//int getjson(char * buf, string * root)
int getjson(char *buf, string root)
{
int len = sizeof(root);
memcpy(buf, root.c_str(), len);
//cout << "buf:"<< buf <<endl;
printf("%s\n", buf);
return len;
}
int ParseJsonFromFile(const char *filename)
{
printf("mingming\n");
// 解析json用Json::Reader
Json::Reader reader;
// Json::Value是一种很重要的类型,可以代表任意类型。如int, string, object, array...
Json::Value root;
std::ifstream is;
is.open(filename, std::ios::binary);
if (!is.is_open())
{
cout << "Error opening file\n";
return -1;
}
cout << is << endl;
if (reader.parse(is, root))
{
std::string code;
if (!root["files"].isNull()) // 访问节点,Access an object value by name, create a null member if it does not exist.
code = root["uploadid"].asString();
cout << code << endl;
// 访问节点,Return the member named key if it exist, defaultValue otherwise.
code = root.get("uploadid", "null").asString();
cout << code << endl;
// 得到"files"的数组个数
int file_size = root["files"].size();
// 遍历数组
for (int i = 0; i < file_size; ++i)
{
Json::Value val_image = root["files"][i]["images"];
int image_size = val_image.size();
for (int j = 0; j < image_size; ++j)
{
std::string type = val_image[j]["type"].asString();
cout << "type"
<< ":" << type << endl;
std::string url = val_image[j]["url"].asString();
cout << "url"
<< ":" << url << endl;
}
}
}
is.close();
return 5;
}
//
int main()
{
int i;
char buf[100];
//从文件读取json流
ParseJsonFromFile("./test.json");
//jie xi zifuchuan
string test = "{\"id\":1,\"name\":\"kurama\"}";
/*if(reader.parse(test,value))
{
if(!value["id"].isNull())
{
cout << value["id"].asInt() <<endl;
cout << value["name"].asString()<<endl;
}
}*/
//创建json字符串对象
Json::Value root;
root["lUserID"] = Json::Value(1);
root["name"] = Json::Value("jiaojiao");
//std::cout << root <<endl;
Json::StyledWriter my_writer;
Json::FastWriter my_fwriter;
//输出json
std::string ss = my_fwriter.write(root);
std::cout << root << endl;
std::cout << ss << endl;
std::cout << "length:" << ss.length() << endl;
Json::Reader reader;
Json::Value myvalue;
//直接引用对象的数据
cout << root["lUserID"].asInt() << endl;
//shu chu json
//解析字符串对象
if (reader.parse(ss, myvalue))
{
cout << myvalue["lUserID"].asInt() << endl;
cout << myvalue["name"].asString() << endl;
}
/* //直接输出
cout << "FastWriter:" << endl;
Json::FastWriter fw;
cout << fw.write(root) << endl << endl;
//缩进输出(格式化输出)
cout << "StyledWriter:" << endl;
Json::StyledWriter sw;
cout << sw.write(root) << endl << endl; */
//输出到文件
Json::StyledWriter sw;
ofstream os;
os.open("./demo.json");
os << sw.write(root);
os.close();
///////////////////////////
cout<<"****\n\t"<<ss<<endl;
// i = getjson(buf, &ss);
i = getjson(buf, ss);
cout<<"****\n\t"<<buf<<endl;
cout << i << endl;
Json::Reader reader0;
Json::Value myvalue0;
cout << "haha" << buf << endl;
//shu chu json
//解析字符串对象
if (reader0.parse(buf, myvalue0))
{
cout << myvalue0["lUserID"].asInt() << endl;
cout << myvalue0["name"].asString() << endl;
}
return 0;
}
mingming
0x7fff019c4890
UP000000
UP000000
type:large
url:fmn061/20111118
type:main
url:fmn061/20111118
{
"lUserID" : 1,
"name" : "jiaojiao"
}
{"lUserID":1,"name":"jiaojiao"}
length:32
1
1
jiaojiao
****
{"lUserID":1,"name":"jiaojiao"}
{"lUserID":1,"name":"jiaojiao"}
6
****
{"lUserID":1,"name":"jiaojiao"}
6
32
haha{"lUserID":1,"name":"jiaojiao"}
6
1
jiaojiao