Json
- 概念
Json 是一种基于文本的、用于表示或者存储对象的格式,同 XML,但是比 XML 更小。 - 基本语法
①.Json 键值对:键值对是 Json 的基本构成。其中,名称即对象的属性名称,必须包含在双引号( " " )中;值即对象对应的属性值;名称和值之间用冒号( : )隔开。
②.Json 值:Json 的值可以是以下几种:字符串、数字( 整型、浮点型 )、布尔值( ture、false )、空值( null )、数组、对象。
③.Json 对象:Json 对象是用大括号( {、} )括起来的一系列 Json 键值对的集合,键值对之间用逗号( , )隔开。
④.Json 数组:Json 数组是用中括号( [、] )括起来的一系列 Json 值的集合,值之间用逗号( , )隔开。
JsonCpp
- 概念
JsonCpp 是 C++ 中一个常用的第三方 Json 解析库,JsonCpp 是开源以及跨平台的。 - Json 下载
最新版下载地址:https://github.com/open-source-parsers/jsoncpp - Json 编译
①.关于 CMake:CMake 是一个跨平台的编译工具,可以用来描述所有平台的编译过程,能够输出各种各样的 makefile 或者 project 文件。
②.编译环境:Win10+Visual Studio 2017。
③.使用 Visual Studio 2017 打开解压目录中的 CMakeLists.txt 文件。
④.更改CMake 设置:分别修改 CMakeSettings.json 中的 generator(生成器名称)、buildCommandArgs(命令行参数) 、buildRoot(生成路径)的参数值,详细参考微软官方文档。
⑤.sln 项目生成:右键 CMakeLists.txt 选择全部生成,会在配置的生成目录生成项目文件。
⑥. jsoncpp.dll 生成:用 Visual Studio 2017 打开解决方案 jsoncpp.sln,选择项目 jsoncpp_lib 进行生成。 - 在项目中应用
①.文件复制:分别将 lib\Debug\jsoncpp.lib、bin\Dubug\jsoncpp.dll、jsoncpp-1.9.4\include 复制到自己的工程目录。
②.路径设置:分别在工程->属性->C/C+±>常规->附加包含目录、工程->属性->链接器->常规->附加库目录添加头文件及 lib 文件路径。
③.项目应用:添加头文件 #include <json/json.h>,引入 lib 文件 #pragma comment(lib,“jsoncpp.lib”)
JsonCpp 使用
- Json::Value
①.概念:Value 用来表示各种类型的对象。
②.对象数据的读取和赋值
Json::Value person;
person["name"] = “张三”;
string name = person["name"].asString() ;
Json::Value root;
root[0] = person;
root.append(person);
int size = root.size();
Json::Value person = root[0] ;
- 对中文的支持
Jsoncpp 默认采用 utf8 编码,中文字符会转换成 unicode 字符,可通过设置禁止编码转换,直接显示为汉字。
Json::StreamWriterBuilder writerBuilder;
writerBuilder.settings_["indentation"] = "";
writerBuilder.settings_["emitUTF8"] = true;
- 生成 Json 对象到字符串
Json::Value root,data;
root["action"] = "run";
data["number"] = 1;
root["data"] = data;
Json::StreamWriterBuilder builder;
const std::string json_file = Json::writeString(builder, root);
- 生成 Json 对象到标准输出流
Json::Value root;
Json::StreamWriterBuilder builder;
const std::unique_ptr<Json::StreamWriter> writer(builder.newStreamWriter());
root["Name"] = "robin";
root["Age"] = 20;
writer->write(root, &std::cout);
- 从字符串解析 Json 对象
JSONCPP_STRING errs;
Json::Value root, person, language, mail;
Json::CharReaderBuilder readerBuilder;
std::unique_ptr<Json::CharReader> const jsonReader(readerBuilder.newCharReader());
bool res = false;
res = jsonReader->parse(jsonStr.c_str(), jsonStr.c_str() + jsonStr.length(), &root, &errs);
- 从标准输入流解析 Json 对象
Json::Value root;
std::ifstream ifs;
Json::CharReaderBuilder builder;
JSONCPP_STRING errs;
bool res = false;
res = parseFromStream(builder, ifs, &root, &errs);
