c++ jsoncpp各种类及方法的全面解析

举报
想飞的咸鱼 发表于 2023/06/14 19:43:23 2023/06/14
【摘要】 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内部使用就不做解释。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。