JsonCpp使用

Posted dsw846

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JsonCpp使用相关的知识,希望对你有一定的参考价值。

JsonCpp主要包含三种类型的class:Value Reader Writer。

jsoncpp中所有对象、类名都在namespace json中,包含json.h即可

  • Json::Value   :可以表示所有支持的类型,如:int , double ,string , object, array等
  • Json::Reader :将文件流或字符串创解析到Json::Value中,主要使用parse函数。
  • Json::Writer  :  与JsonReader相反,将Json::Value转换成字符串流等。

Json内部类和方法:
Reader<是用于读取的,说的确切点,是用于将字符串转换为 Json::Value 对象的>

       【构造函数】
        1、Reader();
        2、Reader( const Features &features );
       【将字符串或者输入流转换为JSON的Value对象】
       【下边是相应的parse的重载函数】
        3、bool parse( const std::string &document, Value &root,bool collectComments = true );
        4、bool parse( const char *beginDoc, const char *endDoc, Value &root,bool collectComments = true        
        5、bool parse( std::istream &is,Value &root,bool collectComments = true );
    Value:<是jsoncpp 中最基本、最重要的类,用于表示各种类型的对象,jsoncpp 支持的对象类型可见                 Json::ValueType 枚举值; Value类的对象代表一个JSON值,既可以代表一个文档,也可以代表                 文档中一个值。如同JSON中定义的“值”一样,Value是递归的>


        【相同类型的比较、交换、类型的获取】
         3、void swap( Value &other );
          ValueType type() const;
          int compare( const Value &other );
        【相应的赋值运算符的重载函数】
         4、Value &operator=( const Value &other );
          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;
          bool operator!() const;
          Value &operator[]( UInt index );
          const Value &operator[]( UInt index ) const;
        【将Value对象进行相应的类型转换】
         5、const char *asCString() const;
          std::string asString() const;
          const char *asCString() const;
          std::string asString() const;
          Int asInt() const;
          UInt asUInt() const;
          double asDouble() const;
        【相应的判断函数】
         6、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;
          bool isValidIndex( UInt index ) const;
          bool isMember( const char *key ) const;
          bool isMember( const std::string &key ) const;
        【清除和扩容函数】
         7、void clear();
         void resize( UInt size );
        【获取满足相应条件的Value】
         8、Value get( UInt index, const Value &defaultValue ) const;
         Value get( const std::string &key,const Value &defaultValue ) const;
         Members getMemberNames() const;
        【删除满足相应条件的Value】
         9、Value removeMember( const char* key );
          Value removeMember( const std::string &key );
         10、void setComment( const char *comment,CommentPlacement placement );
          void setComment( const std::string &comment,CommentPlacement placement );
          bool hasComment( CommentPlacement placement ) const;
          std::string getComment( CommentPlacement placement ) const;
          std::string toStyledString()const; 


Jsoncpp 的 Json::Writer 类是一个纯虚类,并不能直接使用。在此我们使用 Json::Writer 的子类:Json::FastWriter(将数据写入一行,没有格式),Json::StyledWriter(按json格式化输出,易于阅读)

 

JsonCpp读写示例代码:

#include <json/json.h>
#include <sstream>
#include <iostream>
#include <fstream>

void read_json()
{
    std::ifstream ifs;
    ifs.open("a.json");
    std::stringstream buffer;
    buffer << ifs.rdbuf();
    ifs.close();

    auto str = buffer.str();

    Json::Reader reader;
    Json::Value value;
    if (reader.parse(str, value)) {
        if (value["name"].isString()) {
            std::string name = value["name"].asString();
            std::cout << name << std::endl;
        }

        std::cout << value["age"].asInt() << std::endl;        //根据Key获取值时最好判断类型,否则解析会中断
        
        const Json::Value arrayObj = value["like"];
        for (unsigned int i = 0; i < arrayObj.size(); i++) {
            if (!arrayObj[i].isMember("book"))
                continue;
            auto out = arrayObj[i]["book"].asString();
            std::cout << out;
        }
    }
}

void write_json()
{
    Json::FastWriter write;
    Json::Value root;

    Json::Value item;
    Json::Value arrayObj;
    item["book"] = "c++";
    item["food"] = "apple";
    item["music"] = "ddx";
    arrayObj.append(item);

    root["name"] = "dsw";
    root["age"]  = 18;
    root["like"] = arrayObj;    //注意:这里不能用append,append功能是将Json::Value添加到数组末尾

    auto str = root.toStyledString();
    std::cout << str << std::endl;

    std::ofstream ofss;
    ofss.open("a.json");
    ofss << str;
    ofss.close();
}

int main()
{ write_json(); read_json(); getchar();
return 0; }

 

以上是关于JsonCpp使用的主要内容,如果未能解决你的问题,请参考以下文章

为啥 JsonCpp http 客户端在 201 响应代码上失败?

jsoncpp构造json字符串和json数组

C++ jsoncpp 输出名称和值

JsonCpp在vs中使用

jsoncpp使用小结

如何在安卓ndk工程中引入jsoncpp