本篇是《开源代码学习》的第二篇,上一篇为:《一文搞定json解析和封装问题,手把手带你学习CJSON开源代码》
本文阅读一下json11的代码,json11是使用C++11编写的json库,对json11代码或者使用感兴趣的小伙伴可以阅读一下此文。
json11
json11是json11是一个轻量级的C++11库, 提供JSON的序列化和反序列化功能.,
之前在解析json数据的时候,尝试了好几个json库,最终决定使用json11,主要有以下几个原因:
- json的通用功能
- 可以像使用C++类一样使用
- 中文不乱码,这是我选择这个库的主要原因
json11的github地址:json11.
json11源码阅读
项目结构
项目结构比较简单,只有俩个文件
json11.hpp
json11.cpp
ReamME
json11是一个轻量级的C++11库, 提供JSON的序列化和反序列化功能.
核心的对象是 json11::Json. 可以用来表示任意类型的JSON数据:
null, bool, number (int or double), string (std::string), array (std::vector), 或者object (std::map).
json11::Json类型的对象和其他值类型一样,支持赋值、拷贝、传递、比较等操作. 我们还提供了辅助方法
Json::dump用来将json11::Json类型的对象序列化为string Json::parse
(static)用来将std::string反序列化为json11::Json类型的对象
使用C++11提供的初始化器可以很容易创建一个json11::Json对象:
Json my_json = Json::object {
{
"key1", "value1" },
{
"key2", false },
{
"key3", Json::array {
1, 2, 3 } },
};
std::string json_str = my_json.dump();
这里还提供了一些内置的构造函数,可以将标准库类型和用户自定义类型自动的转化为json11::Json对象。例如:
class Point {
public:
int x;
int y;
Point (int x, int y) : x(x), y(y) {
}
Json to_json() const {
return Json::array {
x, y }; }
};
std::vector<Point> points = {
{
1, 2 }, {
10, 20 }, {
100, 200 } };
std::string points_json = Json(points).dump();
json11::
Json同时支持下标和关键字索引:
Json json = Json::array {
Json::object {
{
"k", "v" } } };
std::string str = json[0