Json for Modern C++

Json for Modern C++

nlohman::json是一个高效,容易上手的Json库,只需要添加json.hpp头文件到项目中就可以使用,其支持STL的特性,了解STL就可以开始开发了

在此,介绍我用到的一些的方法,更多使用方法请参考官方示例

使用 json.hpp

将json.hpp拷贝到代码目录中,并引用,可以选择重定义命名空间:

1
2
3
4
#include <json.hpp>

// for convenience
using json = nlohmann::json;

请在C++11或更高版本使用jsonhpp

创建json对象

jsonhpp可以自动识别vlaue的类型,所以不用明确指出创建json对象类型,如需要创建如下json:

1
2
3
4
5
{
"name":"carl",
"age":24,
"phone":["12345678901","12345678902"]
}

我们可以直接赋值:

1
2
3
4
5
6
7
8
9
    json carl;
carl["name"] = "carl";
carl["age"] = 24;
carl["phone"].push_back("12345678901");
carl["phone"].push_back("12345678902");

std::cout << carl << std::endl;

/*{"age":24,"name":"carl","phone":["12345678901","12345678902"]}*/

因为其支持STL的特性,所以可以直接使用STL的特性,如push_back方法

如果想显示的指出json对象的类型,如数组对象,可以如下表示:

1
2
3
4
5
//json phone = json::array({"12345678901","12345678902"});
json phone = json::array();
phone[0] = "12345678902";
phone[1] = "12345678902";
carl["phone"] = phone;

可以直接使用数据进行创建,每个对象需要用花括号包括,key与value使用逗号分隔,实现如下:

1
2
3
4
5
6
json carl = {
{"age",24},
{"name","carl"},
{"phone",
{"12345678901","12345678902"}
}};

jsonhpp支持流操作,所以可以通过流创建json对象:

1
2
3
4
5
6
7
8
9
10
11
12
std::ifstream file("test.json");
if (file.is_open())
{
json carl;
file >> carl;
std::cout << carl << std::endl;
file.close();
}
else
{
std::cout << "file is not open" << std::endl;
}

类型判断

在操作时可以使用type()方法判断类型在进行相应的操作,主要用于数组对象:

1
2
3
4
5
if (carl["phone"].type() == json::value_t::array)
{
carl["phone"].push_back("12345678903");
std::cout << carl["phone"] << std::endl;
}

value_t有如下类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
enum class value_t : std::uint8_t
{
null, ///< null value
object, ///< object (unordered set of name/value pairs)
array, ///< array (ordered collection of values)
string, ///< string value
boolean, ///< boolean value
number_integer, ///< number value (signed integer)
number_unsigned, ///< number value (unsigned integer)
number_float, ///< number value (floating-point)
binary, ///< binary array (ordered collection of bytes)
discarded ///< discarded by the parser callback function
};

获取对象大小

和STL一样可以使用size()方法获取对象大小:

1
std::cout << carl["phone"].size() << std::endl;

判断键是否存在

jsonhpp提供了contains()方法来判断键是否存在,当要修改对应的值时。判断键是否存在很有必要,以免误操作添加了新的键值对

1
2
3
4
5
6
7
8
if(carl.contains("name"))
{
std::cout << "name is exist" << std::endl;
}
else
{
std::cout << "name is not exist" << std::endl;
}

序列化

可以使用dump()方法序列化,dump()也可以传入整数,格式化字符串:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
std::string str;
str = carl.dump();
std::cout << str << std::endl;
//{"age":24,"name":"carl","phone":["12345678901","12345678902"]}

str = carl.dump(4);
std::cout << str << std::endl;
/*
{
"age": 24,
"name": "carl",
"phone": [
"12345678901",
"12345678902"
]
}
*/

反序列化

  • 可以在json字符串后面添加_json后缀:

    1
    json carl = "{\"name\":\"carl\",\"age\":24,\"phone\":[\"12345678901\",\"12345678902\"]}"_json;
  • 可以通过parse()方法:

    1
    json carl = json::parse("{\"name\":\"carl\",\"age\":24,\"phone\":[\"12345678901\",\"12345678902\"]}");

Json for Modern C++
https://carl-5535.github.io/2022/11/21/工作总结/jsonhpp/
作者
Carl Chen
发布于
2022年11月21日
许可协议