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

13,072次阅读
没有评论

共计 2474 个字符,预计需要花费 7 分钟才能阅读完成。

目录

  • 1. 介绍
  • 2.jsoncpp
  • 3. 使用
    • 1.main.cc
    • 2. 序列化
    • 3. 反序列化

1. 介绍

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

2.jsoncpp

  • jsoncpp库用于实现 json 格式的 序列化和反序列化,完成将多个数据对象组织成为格式字符串解析得到多个数据对象的功能
  • 主要借助三个类以及其对应的少量成员函数完成
    
    class Json::Value
    {
    	
    	Value &operator=(const Value &other);
    
    	
    	Value& operator[](const std::string& key);
    	Value& operator[](const char* key);
    
    	
    	Value removeMember(const char* key);
    
    	
    	const Value& operator[](ArrayIndex index) const; 
    
    	
    	Value& append(const Value& value);
    
    	
    	ArrayIndex size() const;
    
    	
    	std::string asString() const;
    
    	
    	const char* asCString() const;
    
    	
    	int asInt() const;              
    
    	
    	float asFloat() const;
    
    	
    	bool asBool() const;
    };
    
    
    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);
    }
    
    
    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;
    }
    
    
    class JSON_API Reader 
    {
    	bool parse(const std::string& document, 
    			   Value& root, bool collectComments = true);
    }
    
    
    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 swb;
    std::unique_ptrJson::StreamWriter> sw(swb.newStreamWriter());

    
    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_ptrJson::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;
}

原文地址: [C][第三方库][jsoncpp]详细讲解

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-10-27发表,共计2474字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)