Json for Modern C++ nlohman::json 是一个高效,容易上手的Json库,只需要添加json.hpp头文件到项目中就可以使用,其支持STL的特性,了解STL就可以开始开发了
在此,介绍我用到的一些的方法,更多使用方法请参考官方示例
使用 json.hpp 将json.hpp拷贝到代码目录中,并引用,可以选择重定义命名空间:
1 2 3 4 #include <json.hpp> 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;
因为其支持STL的特性,所以可以直接使用STL的特性,如push_back方法
如果想显示的指出json对象的类型,如数组对象,可以如下表示:
1 2 3 4 5 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, object, array, string, boolean, number_integer, number_unsigned, number_float, binary, discarded };
获取对象大小 和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; str = carl.dump (4 ); std::cout << str << std::endl;
反序列化
可以在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\"]}" );