C++实用技术 – YAML & JSON互转
YAMLYAML-CPP安装部署
JSONJSONCPP安装部署
代码头文件YamlToJsonJsonToYaml测试代码test.yaml文件测试代码输出结果
总结其他
YAML
YAML是“YAML不是一种标记语言”的外语缩写 (见前方参考资料原文内容);但为了强调这种语言以数据做为中心,而不是以置标语言为重点,而用返璞词重新命名。它是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。 它是类似于标准通用标记语言的子集XML的数据描述语言,语法比XML简单很多。(来自百度百科的介绍)
YAML-CPP
C++的常用YAML处理库YAML-CPP
安装部署
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=ON .. //-DBUILD_SHARED_LIBS=ON 启用动态库
make -j
make install
JSON
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。(来自百度百科的介绍)
JSONCPP
C++的常用json解析库
安装部署
git clone https://github.com/open-source-parsers/jsoncpp.git
cd jsoncpp
mkdir build
cd build
cmake ..
make -j
make install
代码
头文件
#include <yaml-cpp/yaml.h>
#include <json/json.h>
#include <iostream>
YamlToJson
将YAML::Node 转化成 JSon::Value
bool YamlToJson(const YAML
::Node
& ynode
, Json
::Value
& jnode
) {
try {
if(ynode
.IsScalar()) {
Json
::Value
v(ynode
.Scalar());
jnode
.swapPayload(v
);
return true;
}
if(ynode
.IsSequence()) {
for(size_t i
= 0; i
< ynode
.size(); ++i
) {
Json
::Value v
;
if(convert_yaml_to_json(ynode
[i
], v
)) {
jnode
.append(v
);
} else {
return false;
}
}
} else if(ynode
.IsMap()) {
for(auto it
= ynode
.begin();
it
!= ynode
.end(); ++it
) {
Json
::Value v
;
if(convert_yaml_to_json(it
->second
, v
)) {
jnode
[it
->first
.Scalar()] = v
;
} else {
return false;
}
}
}
} catch(...) {
return false;
}
return true;
}
JsonToYaml
将JSon::Value转化成YAML::Node
bool JsonToYaml(const Json
::Value
& jnode
, YAML
::Node
& ynode
) {
try {
if(jnode
.isArray()) {
for(int i
= 0; i
< jnode
.size(); ++i
) {
YAML
::Node n
;
if(convert_json_to_yaml(jnode
[i
], n
)) {
ynode
.push_back(n
);
} else {
return false;
}
}
} else if(jnode
.isObject()) {
for(auto it
= jnode
.begin();
it
!= jnode
.end();
++it
) {
YAML
::Node n
;
if(convert_json_to_yaml(*it
, n
)) {
ynode
[it
.name()] = n
;
} else {
return false;
}
}
} else {
ynode
= jnode
.asString();
}
} catch (...) {
return false;
}
return true;
}
测试代码
test.yaml文件
logs:
- name: root
level: info
appenders:
- type: FileLogAppender
file: "xxx.log"
- type: StdoutLogAppender
- name: system
level: error
appenders:
- type: FileLogAppender
file: "yyy.log"
- type: StdoutLogAppender
测试代码
std
::string
JsonToString(const Json
::Value
& json
) {
Json
::FastWriter w
;
return w
.write(json
);
}
int main(int argc
, char** argv
) {
YAML
::Node node
= YAML
::LoadFile("test.yml");
Json
::Value value
;
YamlToJson(node
, value
);
std
::cout
<< JsonToString(value
) << std
::endl
;
YAML
::Node nnode
;
bool v
= JsonToYaml(value
, nnode
);
std
::cout
<< " =========================== " << std
::endl
;
std
::cout
<< nnode
<< std
::endl
;
std
::cout
<< " ===========================" << std
::endl
;
std
::cout
<< node
<< std
::endl
;
return 0;
}
输出结果
{"logs":[{"appenders":[{"file":"xxx.log","type":"FileLogAppender"},{"type":"StdoutLogAppender"}],"level":"info","name":"root"},{"appenders":[{"file":"yyy.log","type":"FileLogAppender"},{"type":"StdoutLogAppender"}],"level":"error","name":"system"}]}
===========================
logs:
- appenders:
- file: xxx.log
type: FileLogAppender
- type: StdoutLogAppender
level: info
name: root
- appenders:
- file: yyy.log
type: FileLogAppender
- type: StdoutLogAppender
level: error
name: system
===========================
logs:
- name: root
level: info
appenders:
- type: FileLogAppender
file: xxx.log
- type: StdoutLogAppender
- name: system
level: error
appenders:
- type: FileLogAppender
file: yyy.log
- type: StdoutLogAppender
总结
YAML 和 Json 都是结构化标记语言。善用递归,将Yaml对应的结构转化成Json的对应的结构。(反之亦然)
编程思想:善用递归和循环
其他
github: https://github.com/sylar-yin/sylar 视频地址: https://www.bilibili.com/video/av53129011/ 个人主页:http://www.sylar.top/