文章目录
- 0.jsoncpp库是做什么的?
- 1.安装库
- 2.有哪几个类,如何使用
- Json::Value类
- Json::Writer类-StreamWriter
- Json::Reader类-CharReader
- 三者关系
- 3.使用样例
- 将数据先存入Value类,再通过StreamWriter类转为Json格式的字符串
- 获取到Json格式字符串,通过CharReader内容写入到Value类中,通Value类访问元素。
0.jsoncpp库是做什么的?
jsoncpp库用于实现json格式的序列化和反序列化,完成将多个数据对象组织成为json格式字符串,以及将json格式字符串解析到多个数据对象的功能。
1.安装库
2.有哪几个类,如何使用
Json::Value类
中间数据存储类
class Json::Value{
Value &operator=(const Value &other); //Value重载了[]和=,因此所有的赋值和获取数据都可以通过
Value& operator[](const std::string& key);//简单的方式完成 val["姓名"] = "小明";
Value& operator[](const char* key);
Value removeMember(const char* key);//移除元素
const Value& operator[](ArrayIndex index) const; //val["成绩"][0]
Value& append(const Value& value);//添加数组元素val["成绩"].append(88);
ArrayIndex size() const;//获取数组元素个数 val["成绩"].size();
std::string asString() const;//转string string name = val["name"].asString();
const char* asCString() const;//转char* char *name = val["name"].asCString();
Int asInt() const;//转int int age = val["age"].asInt();
float asFloat() const;//转float
bool asBool() const;//转 bool
};
Json::Writer类-StreamWriter
用于对Json::Value中的数据进行序列化
class JSON_API StreamWriter {
virtual int write(Value const& root, std::ostream* sout) = 0;
}
class JSON_API StreamWriterBuilder : public StreamWriter::Factory {
virtual StreamWriter* newStreamWriter() const;
}
只能通过SteamWriterBuilder对象的newStreamWriter去实例化StreamWritrt
Json::Reader类-CharReader
用于对json格式字符串反序列化,将数据对象存储到一个Json::Value对象中
class JSON_API CharReader {
virtual bool parse(char const* beginDoc, char const* endDoc,
Value* root, std::string* errs) = 0;
}
class JSON_API CharReaderBuilder : public CharReader::Factory {
virtual CharReader* newCharReader() const;
}
ChareReader和StreamWriter一样需要通过其他对象来实例化。
三者关系
json格式字符串——(使用CharReader类进行反序列化)——》Json::Value类
Json::Value类——(使用StreamWriter类进行序列化)——》json格式的字符串
3.使用样例
将数据先存入Value类,再通过StreamWriter类转为Json格式的字符串
//json_test.cpp
#include<iostream>
#include<sstream>
#include<string>
#include<memory>
#include<jsoncpp/json/json.h>
int main()
{
std::string name = "小明";
int age = 19;
float score[] = {77.5,88,99.5};
Json::Value val;
val["姓名"] =name;
val["年龄"] = age;
val["成绩"].append(score[0]);
val["成绩"].append(score[1]);
val["成绩"].append(score[2]);
Json::StreamWriterBuilder swb;
std::unique_ptr<Json::StreamWriter>writer(swb.newStreamWriter());
writer->write(val,&std::cout);
std::cout<<std::endl;
return 0;
}
获取到Json格式字符串,通过CharReader内容写入到Value类中,通Value类访问元素。
//json_test2.cpp
#include<jsoncpp/json/json.h>
#include<iostream>
#include<string>
#include<memory>
using namespace std;
int main()
{ string str = R"({ "姓名" : "小明", "年龄" : 19, "成绩" : [ 77.5, 88, 99.5 ] })";
Json::Value val;
Json::CharReaderBuilder crb;
unique_ptr<Json::CharReader> reader(crb.newCharReader());
string err;
reader->parse(str.c_str(),str.c_str()+str.size(),&val,&err);
cout<<val["姓名"].asString()<<endl;
cout<<val["年龄"].asInt()<<endl;
int sz = val["成绩"].size();
for(int i = 0;i<sz;i++)
{
cout<<val["成绩"][i].asFloat()<<endl;
}
for(auto it=val["成绩"].begin();it!=val["成绩"].end();it++)
{
cout<<it->asFloat()<<endl;
}
return 0;
}
我在linux上的makefile:
#makefile
.all:
all:json_test json_test2
json_test2:json_test2.cpp
g++ -o $@ $^ -std=c++11 -ljsoncpp
json_test:json_test.cpp
g++ -o $@ $^ -std=c++11 -ljsoncpp
.PHONY:clean
clean:
rm -rf json_test