常用类接口
Json::Value 类
用于存储 JSON 数据的核心类。它支持将数据解析为对象、数组或基本类型(如字符串、数值等)
赋值操作符:
Value& operator=(Value other);
用于将一个 JSON 值赋给另一个 JSON 值
Json::Value value;
value = "Hello, World!";
访问操作符:
Value& operator[](const char* key);
用于访问或设置对象属性的值
Json::Value value;
value["姓名"] = "张三";
数组追加:
Value& append(const Value& value);
向数组类型的 Value
添加新元素
Json::Value value;
value["成绩"].append(88);
获取字符串值:
std::string asString() const;
将 Value
转换为字符串
std::string name = value["姓名"].asString();
获取数组大小:
ArrayIndex size() const;
返回数组类型的 Value
的元素个数
Json::Value value;
value["成绩"].append(88);
value["成绩"].append(76);
std::cout << value["成绩"].size(); // 输出:2
通过下标访问数组元素:
Value& operator[](ArrayIndex index);
用于访问数组中的某个元素
float score = value["成绩"][0].asFloat();
Write类
Writer 类负责将 Json::Value
对象序列化为字符串或流输出
StreamWriter
接口
- 用于实现自定义的序列化逻辑
root
:要序列化的 JSON 对象sout
:输出流
virtual int write(Value const& root, JSONCPP_OSTREAM* sout) = 0;
StreamWriterBuilder
通过工厂方法生成 StreamWriter
对象
StreamWriter* newStreamWriter();
Json::StreamWriterBuilder builder;
std::unique_ptr<Json::StreamWriter> writer(builder.newStreamWriter());
writer->write(value, &std::cout);
Reader类
CharReader
接口
定义了从字符串解析 JSON 数据的核心方法
beginDoc
和endDoc
:指向 JSON 文本的起始和结束位置root
:解析后的 JSON 数据存放的目标Value
对象errs
:解析过程中的错误信息
virtual bool parse(char const* beginDoc, char const* endDoc,Value* root, JSONCPP_STRING* errs) = 0;
CharReaderBuilder
提供生成 CharReader
对象的工厂方法
CharReader* newCharReader();//事例使用
Json::CharReaderBuilder builder;
std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
Json::Value root;
std::string errors;
std::string jsonText = R"({"name": "张三", "age": 25})";
reader->parse(jsonText.c_str(), jsonText.c_str() + jsonText.size(), &root, &errors);
基本使用
序列化
#include<json/json.h>
#include<memory>
#include<sstream>
#include<iostream>using namespace std;bool Serialize(const Json::Value &val,std::string &dst)
{Json::StreamWriterBuilder swb;swb.settings_["emitUTF8"] = true;std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());std::stringstream ss;int ret = sw->write(val,&ss);if(ret != 0){std::cout<<"Json 反序列化失败\n";return false;}dst = ss.str();return true;
}int main()
{char name[] = "猪猪侠";int age = 18;float score[3] = {0,100,20};Json::Value stu;stu["姓名"] = name;stu["年龄"] = age;stu["成绩"].append(score[0]);stu["成绩"].append(score[1]);stu["成绩"].append(score[2]);std::string stu_str;bool ret = Serialize(stu,stu_str);if(ret == false) return -1;std::cout<<stu_str <<std::endl;return 0;
}
反序列化
#include<json/json.h>
#include<memory>
#include<sstream>
#include<iostream>using namespace std;bool Serialize(const Json::Value &val,std::string &dst)
{Json::StreamWriterBuilder swb;swb.settings_["emitUTF8"] = true;std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());std::stringstream ss;int ret = sw->write(val,&ss);if(ret != 0){std::cout<<"Json 反序列化失败\n";return false;}dst = ss.str();return true;
}bool UnSerialize(const std::string &src , Json::Value &val)
{Json::CharReaderBuilder crb;crb.settings_["emitUTF8"] = true;std::unique_ptr<Json::CharReader> cr(crb.newCharReader());std::string err;bool ret = cr->parse(src.c_str(),src.c_str()+src.size(),&val,&err);if(ret == false){std::cout<<"Json反序列化失败"<<err<<std::endl;return false;}return true;
}int main()
{char name[] = "猪猪侠";int age = 18;float score[3] = {0,100,20};Json::Value stu;stu["姓名"] = name;stu["年龄"] = age;stu["成绩"].append(score[0]);stu["成绩"].append(score[1]);stu["成绩"].append(score[2]);std::string stu_str;bool ret = Serialize(stu,stu_str);if(ret == false) return -1;std::cout<<stu_str <<std::endl;Json::Value val;ret = UnSerialize(stu_str,val);if(ret == false) return -1;std::cout<<val["姓名"].asString()<<std::endl;std::cout<<val["年龄"].asInt()<<std::endl;int sz = val["成绩"].size();for(int i =0;i<sz;++i){std::cout<<val["成绩"][i].asFloat()<<std::endl;}return 0;
}
JSONCPP局限性了解
- 内存开销大,因为其需要非常大的JSON数据集
- 高性能场景下还是选择更加轻量化的方案
- JSONCPP本身不是线程安全的,所以多线程环境下需要设置同步机制