[C++][第三方库][jsoncpp]详细讲解


1.介绍

  • json是一种数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据
  • json数据类型:对象、数组、字符串、数字
    • 对象:使用{}括起来的表示一个对象
    • 数组:使用[]括起来的表示一个数组
    • 字符串:使用""括起来的表示一个字符串
    • 数字:包括整形和浮点型,直接使用

2.jsoncpp

  • jsoncpp库用于实现json格式的序列化和反序列化,完成将多个数据对象组织成为格式字符串解析得到多个数据对象的功能
  • 主要借助三个类以及其对应的少量成员函数完成
    // Json数据对象类 -> 用于进行中间数据存储
    class Json::Value
    {
    	// Value重载了[]和=,因此所有的赋值和获取数据都可以通过[]实现
    	Value &operator=(const Value &other);
    
    	// 简单的方式完成 val["姓名"] = "SnowK";
    	Value& operator[](const std::string& key);
    	Value& operator[](const char* key);
    
    	// 移除元素
    	Value removeMember(const char* key);
    
    	// val["成绩"][0]
    	const Value& operator[](ArrayIndex index) const; 
    
    	// 添加数组元素val["成绩"].append(88); 
    	Value& append(const Value& value);
    
    	// 获取数组元素个数 val["成绩"].size();
    	ArrayIndex size() const;
    
    	// 转string   string name = val["name"].asString();
    	std::string asString() const;
    
    	// 转char*   char *name = val["name"].asCString();
    	const char* asCString() const;
    
    	// 转int  int age = val["age"].asInt();
    	int asInt() const;              
    
    	// 转float
    	float asFloat() const;
    
    	// 转 bool
    	bool asBool() const;
    };
    
    //json序列化类,低版本用这个更简单
    class JSON_API Writer 
    {
    	virtual std::string write(const Value& root) = 0;
    }
    
    class JSON_API FastWriter : public Writer 
    {
    	virtual std::string write(const Value& root);
    }
    
    class JSON_API StyledWriter : public Writer 
    {
    	virtual std::string write(const Value& root);
    }
    
    //json 序列化类,高版本推荐,如果用低版本的接口可能会有警告
    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;
    }
    
    // json反序列化类,低版本用起来更简单
    class JSON_API Reader 
    {
    	bool parse(const std::string& document, 
    			   Value& root, bool collectComments = true);
    }
    
    // json反序列化类,高版本更推荐
    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;
    }
    

3.使用

1.main.cc

int main()
{
    char name[] = "SnowK";
    int age = 18;
    float score[3] = {100, 99, 98};

    Json::Value stu;
    stu["Name"] = name;
    stu["Age"] = age;
    stu["Score"].append(score[0]);
    stu["Score"].append(score[1]);
    stu["Score"].append(score[2]);

    std::string str;
    if(Serialize(stu, str) == false)
    {
        return -1;
    }
    std::cout << str << std::endl;
    std::cout << "-------------------------------" << std::endl;

    Json::Value val;
    if(UnSerialize(str, val) == false)
    {
        return -1;
    }

    std::cout << val["Name"].asString() << std::endl;
    std::cout << val["Age"].asInt() << std::endl;
    for (int i = 0; i < val["Score"].size(); i++)
    {
        std::cout << val["Score"][i].asInt() << std::endl;
    }

    return 0;
}

2.序列化

bool Serialize(const Json::Value &val, std::string &dest)
{
    // 由Json::StreamWriterBuilder生产出Json::StreamWriter
    Json::StreamWriterBuilder swb;
    std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());

    // 通过Json::StreamWrite的write()进行序列化
    std::stringstream ss;
    if (sw->write(val, &ss) != 0)
    {
        std::cout << "Json序列化失败" << std::endl;
        return false;
    }

    dest = ss.str();

    return true;
}

3.反序列化

bool UnSerialize(const std::string &src, Json::Value &val)
{
    Json::CharReaderBuilder crb;
    std::unique_ptr<Json::CharReader> cr(crb.newCharReader());

    std::string err;
    if (cr->parse(src.c_str(), src.c_str() + src.size(), &val, &err) == false)
    {
        std::cout << "json反序列化失败: " << err << std::endl;
        return false;
    }

    return true;
}
Ubuntu 18.04版本(Bionic Beaver)默认的C++编译器g++并不直接支持C++11标准,但你可以通过更新系统或安装额外的工具链来使其支持。为了在Ubuntu 18.04上安装支持C++11的g++并添加第三方库JsonCpp (JSON for Modern C++) 和 OpenSSL,可以按照以下步骤操作: 1. **升级到支持C++11的g++**: 可能需要先更新系统包列表并升级g++。打开终端并运行: ``` sudo apt-get update && sudo apt-get upgrade -y ``` 然后检查你的g++版本: ``` g++ --version ``` 2. **安装libstdc++6-dev**: 这个包包含支持C++11的库。运行: ``` sudo apt-get install libstdc++6-dev ``` 3. **安装JsonCpp**: JsonCpp可以通过包管理器apt获取。如果能找到相应的包,运行: ``` sudo apt-get install libjsoncpp-dev ``` 如果找不到,可能需要从源码编译安装。访问JsonCpp官网下载源码(https://github.com/open-source-parsers/jsoncpp),然后按照官方文档构建和安装。 4. **安装OpenSSL**: 同样地,首先确认是否有预装的OpenSSL包可用: ``` sudo apt-cache search openssl ``` 如果需要安装最新版,运行: ``` sudo apt-get install libssl-dev ``` 或者指定特定版本: ``` sudo apt-get install openssl<version> ``` 5. **配置环境变量**: 如果你需要将这些库加入到项目的链接器搜索路径中,可以在`~/.bashrc`或`.zshrc`文件中添加必要的库路径,例如: ```bash export LDFLAGS="-L/usr/lib/x86_64-linux-gnu" export CPPFLAGS="-I/usr/include/jsoncpp" ``` 完成以上步骤后,你应该就可以在Ubuntu 18.04上使用g++ 11及其兼容版本,并能够链接到JsonCpp和OpenSSL库了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DieSnowK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值