C++实用技术 – YAML & JSON互转

    xiaoxiao2022-07-07  211

    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> //yaml-cpp头文件 #include <json/json.h> //jsoncpp头文件 #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

    测试代码

    //将Json转成string std::string JsonToString(const Json::Value& json) { Json::FastWriter w; return w.write(json); } int main(int argc, char** argv) { //加载yaml文件 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/

    最新回复(0)