C++ Hjson-cpp处理JSON类型配置文件详解
作者:小灰灰搞电子
Hjson-Cpp简介
Hjson-Cpp是C++实现的Hjson解析库。Hjson(Human JSON)是JSON的扩展格式,支持注释、多行字符串等更友好的语法,适用于配置文件等场景。Hjson-Cpp提供将Hjson转换为JSON或直接解析为C++对象的功能。
- 支持注释:单行(//)和多行(/* */)注释
- 宽松语法:字符串可以不加引号,末尾逗号可省略
- 多行字符串:更自然的文本块表示
- 更友好的错误提示:定位配置错误更直观
核心特性
支持标准Hjson语法,包括注释(#或//)、无引号键名、多行字符串。
提供与JSON互转的能力,兼容现有JSON工具链。
轻量级实现,仅依赖C++11标准库。
安装与集成
使用CMake集成Hjson-cpp:
find_package(hjsoncpp REQUIRED) target_link_libraries(your_target PRIVATE hjsoncpp)
或手动下载源码后,将include/hjson目录添加到项目头文件路径。
基本用法示例
解析Hjson字符串并读取内容:
#include <hjson/hjson.h>
#include <iostream>
#include <fstream>
int main() {
// 从字符串解析
std::string configStr = R"(
// 这是一个Hjson配置示例
{
appName: My Application // 字符串可以不加引号
version: 1.2.3
features: [
"fast-mode" // 引号也是允许的
dark-theme // 这种写法也可以
auto-save // 最后一个元素可以不加逗号
]
/* 多行
注释 */
timeout: 30s // 带单位的数值
}
)";
Hjson::Value config;
try {
config = Hjson::Unmarshal(configStr);
// 访问数据
std::cout << "App: " << config["appName"].to_string() << "\n";
std::cout << "Version: " << config["version"].to_double() << "\n";
// 遍历数组
std::cout << "Features:\n";
for (auto& feature : config["features"]) {
std::cout << " - " << feature.to_string() << "\n";
}
} catch (Hjson::syntax_error& e) {
std::cerr << "配置语法错误: " << e.what() << "\n";
return1;
}
return0;
}
常用API说明
Hjson::Marshal(value):将C++对象序列化为Hjson字符串。
Hjson::Unmarshal(text):解析Hjson文本为Hjson::Value对象。
value.to_string()/to_int():类型转换方法。
value[key]:访问对象成员或数组元素。
与JSON互转
将JSON转为Hjson(保留注释等扩展特性):
Hjson::Value jsonData = Hjson::Unmarshal(jsonText); std::string hjsonText = Hjson::Marshal(jsonData);
错误处理
解析失败时抛出Hjson::syntax_error异常:
try {
Hjson::Unmarshal("invalid hjson");
} catch (const Hjson::syntax_error& e) {
std::cerr << "Error: " << e.what() << "\n";
}
性能建议
对于大型文件,优先使用UnmarshalFromFile直接读取文件。
频繁操作时可复用Hjson::Value对象减少内存分配。
高级特性
1. 类型安全访问
// 安全获取配置值(带默认值)
std::string appName = config.get("appName", "Default App");
int timeout = config.get("timeout", 10); // 自动类型转换
// 检查类型
if (config["features"].type() == Hjson::Type::Vector) {
std::cout << "features是数组类型\n";
}
// 类型转换方法
double version = config["version"].to_double();
std::string versionStr = config["version"].to_string(); // 自动转换
2. 文件操作
// 从文件加载配置
try {
Hjson::Value fileConfig = Hjson::UnmarshalFromFile("config.hjson");
// 修改配置
fileConfig["lastRun"] = Hjson::Value(time(nullptr));
// 写回文件(保留注释和格式)
Hjson::MarshalToFile(fileConfig, "config.hjson");
} catch (Hjson::file_error& e) {
std::cerr << "文件操作失败: " << e.what() << "\n";
}
3. 自定义解析规则
// 解析带单位的数值
Hjson::DecoderOptions options;
options.unitResolver = [](const std::string& unit, double value) {
if (unit == "s") return value * 1000; // 秒转毫秒
if (unit == "min") return value * 60 * 1000;
return value;
};
Hjson::Value customConfig = Hjson::Unmarshal("timeout: 30s", options);
std::cout << "Timeout in ms: " << customConfig["timeout"].to_int64() << "\n";
使用教程
下载
点击https://github.com/hjson/hjson-cpp跳转到github:

点击Download下载源码。

使用
VS新建工程:

拷贝Hjson源码进入工程目录:

编写测试代码:
#include <iostream>
#include "hjson.h"
using namespace std;
static const char* _szDefaultConfig = R"(
{
imageSource: NO DEFAULT
showImages: true
writeImages: true
printFrameIndex: false
printFrameRate: true
}
)";
Hjson::Value GetConfig(const char* szConfigPath) {
Hjson::Value defaultConfig = Hjson::Unmarshal(_szDefaultConfig);
Hjson::Value inputConfig;
try {
inputConfig = Hjson::UnmarshalFromFile(szConfigPath);
}
catch (const std::exception& e) {
std::fprintf(stderr, "Error in config: %s\n\n", e.what());
std::fprintf(stdout, "Default config:\n");
std::fprintf(stdout, _szDefaultConfig);
return Hjson::Value();
}
return Hjson::Merge(defaultConfig, inputConfig);
}
int main()
{
string path = "C:\\Users\\徐鹏\\Desktop\\hjson\\test.json";
Hjson::Value val = GetConfig(path.c_str());
printf("%s\r\n",val["imageSource"].to_string().c_str());
Hjson::Value a = val.at("showImages");
printf("%d\r\n", a.to_int64());
return 0;
}
运行查看结果:

到此这篇关于C++ Hjson-cpp处理JSON类型配置文件详解的文章就介绍到这了,更多相关C++处理JSON内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
