第三方库jsoncpp

发布于:2024-08-02 ⋅ 阅读:(75) ⋅ 点赞:(0)


0.jsoncpp库是做什么的?

jsoncpp库用于实现json格式的序列化和反序列化,完成将多个数据对象组织成为json格式字符串,以及将json格式字符串解析到多个数据对象的功能。

1.安装库

2.有哪几个类,如何使用

Json::Value类

中间数据存储类

class Json::Value{ 
 Value &operator=(const Value &other); //Value重载了[]和=,因此所有的赋值和获取数据都可以通过
 Value& operator[](const std::string& key);//简单的方式完成 val["姓名"] = "小明"; 
 Value& operator[](const char* key); 
 Value removeMember(const char* key);//移除元素
 const Value& operator[](ArrayIndex index) const; //val["成绩"][0] 
 Value& append(const Value& value);//添加数组元素val["成绩"].append(88); 
 ArrayIndex size() const;//获取数组元素个数 val["成绩"].size(); 
 std::string asString() const;//转string string name = val["name"].asString(); 
 const char* asCString() const;//转char* char *name = val["name"].asCString(); 
 Int asInt() const;//转int int age = val["age"].asInt(); 
 float asFloat() const;//转float 
 bool asBool() const;//转 bool 
};

Json::Writer类-StreamWriter

用于对Json::Value中的数据进行序列化

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

只能通过SteamWriterBuilder对象的newStreamWriter去实例化StreamWritrt

Json::Reader类-CharReader

用于对json格式字符串反序列化,将数据对象存储到一个Json::Value对象中

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

ChareReader和StreamWriter一样需要通过其他对象来实例化。

三者关系

json格式字符串——(使用CharReader类进行反序列化)——》Json::Value类
Json::Value类——(使用StreamWriter类进行序列化)——》json格式的字符串

3.使用样例

将数据先存入Value类,再通过StreamWriter类转为Json格式的字符串

//json_test.cpp
#include<iostream>
#include<sstream>
#include<string>
#include<memory>
#include<jsoncpp/json/json.h>

int main()
{
  std::string name = "小明";
  int age = 19;
  float score[] = {77.5,88,99.5};
  Json::Value val;
  val["姓名"] =name;
  val["年龄"] = age;
  val["成绩"].append(score[0]);
  val["成绩"].append(score[1]);
  val["成绩"].append(score[2]);

  Json::StreamWriterBuilder swb;
  std::unique_ptr<Json::StreamWriter>writer(swb.newStreamWriter());
  writer->write(val,&std::cout);
  std::cout<<std::endl;

  return 0;
}

在这里插入图片描述

获取到Json格式字符串,通过CharReader内容写入到Value类中,通Value类访问元素。

//json_test2.cpp
#include<jsoncpp/json/json.h>
#include<iostream>
#include<string>
#include<memory>
using namespace std;
int main()
{ string str = R"({ "姓名" : "小明", "年龄" : 19, "成绩" : [ 77.5, 88, 99.5 ] })";
  Json::Value val;
  Json::CharReaderBuilder crb;
  unique_ptr<Json::CharReader> reader(crb.newCharReader());
  string err;
  reader->parse(str.c_str(),str.c_str()+str.size(),&val,&err);
  cout<<val["姓名"].asString()<<endl;
  cout<<val["年龄"].asInt()<<endl;
  int sz = val["成绩"].size();
  for(int i = 0;i<sz;i++)
  {
    cout<<val["成绩"][i].asFloat()<<endl;
  }
  for(auto it=val["成绩"].begin();it!=val["成绩"].end();it++)
  {
    cout<<it->asFloat()<<endl;
  }
  return 0;
}

在这里插入图片描述


我在linux上的makefile:

#makefile

.all:
all:json_test json_test2 

json_test2:json_test2.cpp 
	g++ -o $@ $^ -std=c++11 -ljsoncpp

json_test:json_test.cpp
	g++ -o $@ $^ -std=c++11 -ljsoncpp
.PHONY:clean
clean:
	rm -rf json_test


网站公告

今日签到

点亮在社区的每一天
去签到