c++ jsoncpp各种类及方法的全面解析
jsoncpp类
Json::FastWriter:输出json格式的值,不需要格式化。
Json::Features:传递给读写器的配置
Json::Path:表示访问节点的路径(未测试)
Json::PathArgument:访问节点路径的元素(未测试)
Json::Reader:将json数据反序列化
Json::StaticString:标记静态字符串的轻量级包装器
Json::StyledStreamWriter:以一种人性化的方式将JSON格式的值写入流而不是字符串
Json::StyledWriter:以JSON格式输出值
Json::Value:表示一个json值
Json::ValueConstIterator:对象和数组值的Const迭代器
Json::ValueInternalArray:Value内部使用的简化deque实现
Json::ValueInternalMap:Value内部使用的基于链接页的哈希表实现
Json::ValueIterator:对象和数组值的迭代器
Json::ValueIteratorBase:值迭代器的基类
Json::ValueMapAllocator:分配程序自定义值内部映射
Json::Writer:writer的抽象类
Json::Value
对json值的各种操作方法,按照功能大致分为如下几类:
符号重载
bool operator< (const Value &other) const//< 符号重载
bool operator<= (const Value &other) const//<= 符号重载
bool operator>= (const Value &other) const//>= 符号重载
bool operator> (const Value &other) const//> 符号重载
bool operator== (const Value &other) const//== 符号重载
bool operator!= (const Value &other) const //!= 符号重载
int compare (const Value &other) const //比较Value,小于other返回-1,大于other返回1 相等返回0
Value类型
//序列化json数据
const char * asCString () const //const char *类型
std::string asString () const//string类型
Int asInt () const//int类型
UInt asUInt () const//uint类型
Int64 asInt64 () const//int64_t类型
UInt64 asUInt64 () const//uint64_t类型
LargestInt asLargestInt () const
LargestUInt asLargestUInt () const
float asFloat () const//浮点类型
double asDouble () const//浮点类型
bool asBool () const//bool类型
//这类函数用法如下
Json::Value val = {"name":"yang"};
std::string str = val["name"].asString();//将json的值转化为string类型
//这类接口只能转化json值,不能带key一起转化,例如:val.asString();会出现段错误;具体怎么带key值转化,继续看!
//判断Value类型,为真返回true
bool isNull () const
bool isBool () const
bool isInt () const
bool isUInt () const
bool isIntegral () const
bool isDouble () const
bool isNumeric () const
bool isString () const
bool isArray () const
bool isObject () const
bool isConvertibleTo (ValueType other) const
//这类函数用法如下
Json::Value val = {"name":"yang"};
if(val["name"].isString());//判断json的值是否为string类型
{
std::string << "name val type is string" << std::endl;
}
ArrayIndex size () const
获取数组的元素个数,ArrayIndex是unsigned int的命名。
Json::Value root="{[{"name":"yang"},{"age":10}]}"
int size = root.size();
bool empty () const
判断某个key的值是否为空,如果是空数组,空的object,或者null都会返回true。
Json::Value empty;
empty["array"] = Json::Value(Json::arrayValue);
empty["obj"] = Json::Value(Json::objectValue);
empty["null"] = Json::Value(Json::nullValue);
if(empty["array"].empty())
std::cout << "array is empty" << std::endl;
if(empty["obj"].empty())
std::cout << "obj is empty" << std::endl;
if(empty["null"].empty())
std::cout << "null is empty" << std::endl;
std::cout << empty.toStyledString() << std::endl;
//打印
array is empty
obj is empty
null is empty
{
"array" : [],
"null" : null,
"obj" : {}
}
//以上都会返回true。
void clear ()
清除所有的object成员和数组成员
Json::Value node = {"name":"yang"}
node.clear();
std::cout << "node : " << node.toStyledString() << std::endl;
node["name"].clear();
std::cout << "node : " << node.toStyledString() << std::endl;
//打印
node : {}
node : {
"name" : null
}
void resize (ArrayIndex size)
重新定义数组的大小,下面代码说明一切:
Json::Value array;
std::cout << "array : " << array.toStyledString() << std::endl;
array.resize(0);//创建空数组
std::cout << "array : " << array.toStyledString() << std::endl;
array.resize(2);
std::cout << "array : " << array.toStyledString() << std::endl;
//打印
array : null
array : []
array : [
null,
null
]
Json::Value array;
Json::Value mem;
mem["name"] = "yang";
array.append(mem);
Json::Value mem1;
mem1["age"] = 10;
array.append(mem1);
std::cout << "array : " << array.toStyledString() << std::endl;
array.resize(1);
std::cout << "array : " << array.toStyledString() << std::endl;
//打印
array : [
{
"name" : "yang"
},
{
"age" : 10
}
]
array : [
{
"name" : "yang"
}
]
get函数
Value get (ArrayIndex index, const Value &defaultValue) const
获取数组第index元素的值,如果index存在返回index对应成员,如果不存在返回defaultValue,而defaultValue一直为null。
Json::Value array;
Json::Value mem;
mem["name"] = "yang";
array.append(mem);
Json::Value mem1;
mem1["age"] = 10;
array.append(mem1);
std::cout << "array : " << array.toStyledString() << std::endl;
Json::Value value;
Json::Value reply;
reply = array.get(1, value);
std::cout << "value : " << value.toStyledString() << std::endl;
std::cout << "reply : " << reply.toStyledString() << std::endl;
//打印
array : [
{
"name" : "yang"
},
{
"age" : 10
}
]
value : null
reply : {
"age" : 10
}
Value get (const char *key, const Value &defaultValue) const
通过key获取object值;如果key存在返回key对应的值,如果不存在返回defaultValue
Json::Value node = {"name":"yang", "age":10}
Json::Value value;
Json::Value reply;
reply = node.get("name", value);
std::cout << "value : " << value.toStyledString() << std::endl;
std::cout << "reply : " << reply.toStyledString() << std::endl;
//打印
value : null
reply : "yang"
Value get (const std::string &key, const Value &defaultValue) const
如果成员名称key存在,则返回该成员,否则返回defaultValue。
和上面的get用法一样,给函数的内部实现为:return get( key.c_str(), defaultValue );,就是调用的上面的get函数。
append函数
向数组中添加元素
Json::Value root;
Json::Value mem;
mem["name"] = "yang";
root.append(mem);
std::cout << root.toStyledString() << std::endl;
//打印
[{"name":"yang"}]
//也可以添加上key:
root["array"].append(mem);
removeMember函数
bool removeMember (const char *key)
移除并返回指定的成员
Json::Value node = {"name":"yangh", "age":10};
std::cout << "node : " << node.toStyledString() << std::endl;
node.removeMember("name");
std::cout << "node : " << node.toStyledString() << std::endl;
//打印
node : {
"age" : 10,
"name" : "yang"
}
node : {
"age" : 10
}
bool removeMember (const std::string &key)
和上面的removeMember(const char *key)用法一样,内部实现为:return removeMember(key.c_str());
isMember函数
bool isMember (const char *key) const
如果对象有一个名为key的成员,则返回true。
Json::Value node;//(node = {"name":"yangh", "age":10})
node["name"] = "yang";
node["age"] = 10;
bool reply;
reply = node.isMember("name");
if(reply)
std::cout << "name is exit!" << std::endl;
//打印
name is exit!
bool isMember (const std::string &key) const
和上面的函数用法相同,内部实现为:return isMember(key.c_str());就是调用了上面的函数。
getMemberName函数
Members getMemberNames () const
返回value的key值列表,Members的定义:#typedef std::vector Members;
Json::Value node;//(node = {"name":"yangh", "age":10})
node["name"] = "yang";
node["age"] = 10;
std::vector<std::string> ret;
ret = node.getMemberNames();
for(auto item : ret)
std::cout << item << std::endl;
//打印
name
age
注释函数
void setComment (const char *comment, CommentPlacement placement)//在高版本该函数已经启用,可以使用下面的函数
void setComment (const std::string &comment, CommentPlacement placement)
在指定位置添加注释
参数:
comment:要添加的注释内容;内容必须是://....., /*......*/, c语言的注释方式
placement:注释添加的位置,定义如下:
CommentPlacement定义:
enum CommentPlacement{
commentBefore=0, //放置在值前一行的注释
commentAfterOnSameLine,//同一行值后面的注释
commentAfter,//值后面行上的注释(仅对根值有意义)
numberOfCommentPlacement
};
实例:
Json::Value node;//(node = {"name":"yangh", "age":10})
node["name"] = "yang";
node["age"] = 10;
std::string test = "//test is this";
node.setComment(test, Json::commentBefore);
std::cout << node.toStyledString() << std::endl;
//打印
//test is this
{
"age" : 10,
"name" : "yang"
}
bool hasComment (CommentPlacement placement) const
监测指定位置是否有注释
Json::Value node;//(node = {"name":"yangh", "age":10})
node["name"] = "yang";
node["age"] = 10;
std::string test = "//test is this";
node.setComment(test, Json::commentAfterOnSameLine);
bool res;
res = node.hasComment(Json::commentAfterOnSameLine);
if(res)
std::cout << "have comment !" << std::endl;
else
std::cout << "not have comment !" << std::endl;
//打印
have comment !
std::string getComment (CommentPlacement placement) const
获取指定位置的注释内容
Json::Value node;//(node = {"name":"yangh", "age":10})
node["name"] = "yang";
node["age"] = 10;
std::string test = "//test is this";
node.setComment(test, Json::commentAfterOnSameLine);
std::string res;
res = node.getComment(Json::commentAfterOnSameLine);
std::cout << res << std::endl;
//打印
//test is this
toStyledString函数
std::string toStyledString() const
反序列化,将json格式的数据转化为string类型,和asString不同,asString只能转换object的值,而toStyledstring() 能带key一起转换。
Json::Value node;//(node = {"name":"yangh", "age":10})
node["name"] = "yang";
node["age"] = 10;
std::string str = node.toStyledString();
std::cout << str << std::endl;
//打印
{"name":"yangh", "age":10}
迭代器函数
相关函数:
begin():json的第一个object
end():json的最后一个object
key():获取迭代器的key,返回的是一个Value类型
name():获取迭代器的名字,也就是key,返回的是string类型
memberName():获取迭代器的成员名,也就是key。返回的是const char *类型
index(); 获取迭代器的序号,用于数组,如果不是数组返回-1
关于函数细节请参考第五章Json::ValueIterator
Json::Value node;
node["age"] = 10;
Json::Value::iterator bers;
for(bers = node.begin(); bers != node.end(); bers++)
{
std::cout << bers.key().toStyledString() << std::endl;
std::cout << bers.name() << std::endl;
printf("%s\n", bers.memberName());
std::cout << bers.index() << std::endl;
}
//打印
"age"
age
age
4294967295
"name"
name
name
4294967295
Json::Reader
parse序列化函数
bool parse (const char *beginDoc, const char *endDoc, Value &root, bool collectComments=true)
将从起始地址beginDoc到结束地址endDoc的字符转化为json格式赋值给root。
参数:
beginDoc:字符串起始地址
endDoc:字符串结束地址
root:json值
collectComments: True表示收集注释并允许在序列化期间将它们写回来,false表示丢弃注释
std::string str = "{\"name\":10}";
Json::Reader reader;
Json::Value root;
const char *begin = str.c_str();
const char *end = begin + str.length();
reader.parse(begin, end, root));
bool parse (const std::string &document, Value &root, bool collectComments=true)
和上面的函数使用方法是一样的,内部就是调用上面的接口,内部实现代码和我上面的例子差不多。
bool parse (std::istream &is, Value &root, bool collectComments=true)
和上面的函数使用方法是一样的,内部调用的是parse (const std::string &document, Value &root, bool collectComments=true) 实现如下(一般用于读写文件):
Reader::parse( std::istream& sin, Value &root,bool collectComments )
{
std::string doc;
std::getline(sin, doc, (char)EOF);
return parse( doc, root, collectComments );
}
错误解析
std::string getFormatedErrorMessages () const
获取错误信息
std::string str = "{\"name\":10}";
Json::Reader reader;
Json::Value root;
if(reader.parse(str, root))
std::cout << "right !" << std::endl;
else//获取解析失败的原因
std::cout << "error msg :" << reader.getFormatedErrorMessages () <<std::endl
std::string Reader::getFormattedErrorMessages() const
和上面的函数用法一摸一样,内部就是调用了上面的函数。
Json::Writer/Json::FastWriter/Json::StyledWriter/Json::StyledStreamWriter
有三种写入类:
基类:Json::Writer
子类:Json::FastWriter//不带格式的转换json数据为字符串
子类:Json::StyledWriter//带json格式的转换json数据为字符串
独立类:Json::StyledStreamWriter //以流的形式转换json数据为字符串,一般用于写文件
Json::Writer
virtual std::string write (const Value &root)=0
纯虚函数,实现与Json::FastWriter和StyledWriter子类中。
Json::FastWriter
virtual std::string write (const Value &root)
序列化,将root格式的数据转化为无格式的string类型。
Json::Value root;
Json::FastWriter writer;
root["name"] = "yang";
std::string str = writer.write(root);
//打印
{"name":"yang"}
void enableYAMLCompatibility()
转化格式时在:(冒号)后添加空格
Json::Value node;
Json::FastWriter writer;
node["name"] = "yang";
std::string wr = writer.write(node);
std::cout << wr << std::endl;
writer.enableYAMLCompatibility();
std::string wi = writer.write(node);
std::cout << wi << std::endl;
//打印
{"name":"yang"}
{"name": "yang"}
Json::StyledWriter
virtual std::string write (const Value &root)
序列化,将root格式的数据转化为json格式的string类型。
Json::Value node;
node["name"] = "yang";
Json::FastWriter writer;
std::string wr = writer.write(node);
std::cout << wr << std::endl;
Json::StyledWriter writ;
std::string wi = writ.write(node);
std::cout << wi << std::endl;
//打印
{"name":"yang"}
{
"name" : "yang"
}
Json::StyledStreamWriter
void write (std::ostream &out, const Value &root)
将root转化为字符串,输出到out中,一般用于写文件。
Json::Value node;
node["name"] = "yang";
Json::StyledStreamWriter www;
std::ofstream ofs;
ofs.open("test.json");
www.write(ofs, node);
ofs.close();
//这样就可以将node的json数据写入test.json文件中
迭代器
有三种迭代器的类:
Json::ValueConstIterator:对象和数组值的Const迭代器,继承ValueIteratorBase基类
Json::ValueIterator:对象和数组值的迭代器,继承ValueIteratorBase基类
Json::ValueIteratorBase:值迭代器的基类
两个子类除了重载没有其余方法实现,基类有以下方法供子类和父类调用:
Value key () const
获取key值,返回Value类型
UInt index () const
返回当前序号,如果不是数组返回-1;
const char * memberName () const
获取key,以const char *类型返回;
Json::string name() const
获取key, 以string类型返回
Json::Value node;
node["age"] = 10;
Json::Value::iterator bers;
for(bers = node.begin(); bers != node.end(); bers++)
{
std::cout << bers.key().toStyledString() << std::endl;
std::cout << bers.name() << std::endl;
printf("%s\n", bers.memberName());
std::cout << bers.index() << std::endl;
}
//打印
"age"
age
age
4294967295
"name"
name
name
4294967295
Json::StaticString
只有一个c_str()方法,用法通std::string.
结语
其他类属于未测试,或者json内部使用就不做解释。
- 点赞
- 收藏
- 关注作者
评论(0)