C++ Hjson-cpp处理JSON类型配置文件详解

 更新时间:2025年06月17日 11:01:36   作者:小灰灰搞电子  
Hjson-Cpp是C++实现的Hjson解析库,支持注释、多行字符串等更友好的语法,适用于配置文件等场景,下面我们就来看看它的具体使用方法吧

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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简单总结C语言中各种类型的指针的概念

    简单总结C语言中各种类型的指针的概念

    这篇文章主要简单总结了C语言中各种类型的指针的概念,指针可以说是C语言本身所具有的最大特性,平时根据不同使用场合习惯地将其简单分类,需要的朋友可以参考下
    2016-03-03
  • LZ77压缩算法原理的理解

    LZ77压缩算法原理的理解

    这篇文章主要介绍了LZ77压缩算法原理的理解的相关资料,数据压缩是一个减小数据存储空间的过程,目前被应用在软件工程的各个地方,了解其一些原理,方便我们更好的甄选压缩方案,需要的朋友可以参考下
    2017-08-08
  • c语言中单引号和双引号的区别(顺利解决从字符串中提取IP地址的困惑)

    c语言中单引号和双引号的区别(顺利解决从字符串中提取IP地址的困惑)

    c语言中的单引号和双引号可是有很大区别的,使用之前一定要了解他们之间到底有什么不同,下面小编就给大家详细的介绍一下吧,对此还不是很了解的朋友可以过来参考下
    2013-07-07
  • 详细聊聊c语言中的缓冲区问题

    详细聊聊c语言中的缓冲区问题

    缓冲区又称为缓存,它是内存空间的一部分,也就是说在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,这篇文章主要给大家介绍了关于c语言中缓冲区问题的相关资料,需要的朋友可以参考下
    2021-11-11
  • C++代码实现扫雷游戏

    C++代码实现扫雷游戏

    这篇文章主要为大家详细介绍了C++代码实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • Linux线程管理必备:解析互斥量与条件变量的详解

    Linux线程管理必备:解析互斥量与条件变量的详解

    本篇文章是对互斥量与条件变量的应用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 详解C++中的常量

    详解C++中的常量

    这篇文章主要介绍了C++中的常量的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • C++实现raw_input的方法

    C++实现raw_input的方法

    这篇文章主要介绍了C++实现raw_input的方法,通过C++来实现Python中发raw_input的方法,非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • vscode配置远程开发环境并远程调试运行C++代码的教程

    vscode配置远程开发环境并远程调试运行C++代码的教程

    这篇文章主要介绍了vscode配置远程开发环境并远程调试运行C++代码的教程,本文通过截图实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • C/C++如何实现两矩阵相乘之模拟法

    C/C++如何实现两矩阵相乘之模拟法

    C++矩阵运算矩阵运算包括矩阵相加、相减、相乘、转置、求逆矩阵等等,用计算机程序实现矩阵运算的方法算法很多,这篇文章主要给大家介绍了关于C/C++如何实现两矩阵相乘之模拟法的相关资料,需要的朋友可以参考下
    2023-02-02

最新评论