最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ Hjson-cpp處理JSON類型配置文件詳解

 更新時間:2025年06月17日 11:01:36   作者:小灰灰搞電子  
Hjson-Cpp是C++實現(xiàn)的Hjson解析庫,支持注釋、多行字符串等更友好的語法,適用于配置文件等場景,下面我們就來看看它的具體使用方法吧

Hjson-Cpp簡介

Hjson-Cpp是C++實現(xiàn)的Hjson解析庫。Hjson(Human JSON)是JSON的擴展格式,支持注釋、多行字符串等更友好的語法,適用于配置文件等場景。Hjson-Cpp提供將Hjson轉(zhuǎn)換為JSON或直接解析為C++對象的功能。

  • 支持注釋:單行(//)和多行(/* */)注釋
  • 寬松語法:字符串可以不加引號,末尾逗號可省略
  • 多行字符串:更自然的文本塊表示
  • 更友好的錯誤提示:定位配置錯誤更直觀

核心特性

支持標(biāo)準(zhǔn)Hjson語法,包括注釋(#或//)、無引號鍵名、多行字符串。

提供與JSON互轉(zhuǎn)的能力,兼容現(xiàn)有JSON工具鏈。

輕量級實現(xiàn),僅依賴C++11標(biāo)準(zhǔn)庫。

安裝與集成

使用CMake集成Hjson-cpp:

find_package(hjsoncpp REQUIRED)
target_link_libraries(your_target PRIVATE hjsoncpp)

或手動下載源碼后,將include/hjson目錄添加到項目頭文件路徑。

基本用法示例

解析Hjson字符串并讀取內(nèi)容:

#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  // 帶單位的數(shù)值
        }
    )";

    Hjson::Value config;
    try {
        config = Hjson::Unmarshal(configStr);
        
        // 訪問數(shù)據(jù)
        std::cout << "App: " << config["appName"].to_string() << "\n";
        std::cout << "Version: " << config["version"].to_double() << "\n";
        
        // 遍歷數(shù)組
        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():類型轉(zhuǎn)換方法。

value[key]:訪問對象成員或數(shù)組元素。

與JSON互轉(zhuǎn)

將JSON轉(zhuǎn)為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";
}

性能建議

對于大型文件,優(yōu)先使用UnmarshalFromFile直接讀取文件。

頻繁操作時可復(fù)用Hjson::Value對象減少內(nèi)存分配。

高級特性

1. 類型安全訪問

// 安全獲取配置值(帶默認值)
std::string appName = config.get("appName", "Default App");
int timeout = config.get("timeout", 10);  // 自動類型轉(zhuǎn)換

// 檢查類型
if (config["features"].type() == Hjson::Type::Vector) {
    std::cout << "features是數(shù)組類型\n";
}

// 類型轉(zhuǎn)換方法
double version = config["version"].to_double();
std::string versionStr = config["version"].to_string();  // 自動轉(zhuǎn)換

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. 自定義解析規(guī)則

// 解析帶單位的數(shù)值
Hjson::DecoderOptions options;
options.unitResolver = [](const std::string& unit, double value) {
    if (unit == "s") return value * 1000;  // 秒轉(zhuǎn)毫秒
    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跳轉(zhuǎn)到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;
}

運行查看結(jié)果:

到此這篇關(guān)于C++ Hjson-cpp處理JSON類型配置文件詳解的文章就介紹到這了,更多相關(guān)C++處理JSON內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C/C++中CJSON的使用(創(chuàng)建與解析JSON數(shù)據(jù))

    C/C++中CJSON的使用(創(chuàng)建與解析JSON數(shù)據(jù))

    cJSON是一個超輕巧的JSON解析器,本文主要介紹了C/C++中CJSON的使用(創(chuàng)建與解析JSON數(shù)據(jù)),具有一定的參考價值,感興趣的可以了解一下
    2021-09-09
  • C++深入探究類與對象之對象模型與this指針使用方法

    C++深入探究類與對象之對象模型與this指針使用方法

    C++對象模型中只有類的非static成員以及一個指向虛函數(shù)表的指針被配置于類對象內(nèi),其他都在類對象外,在 C++ 中,每一個對象都能通過 this 指針來訪問自己的地址。this 指針是所有成員函數(shù)的隱含參數(shù)。因此,在成員函數(shù)內(nèi)部,它可以用來指向調(diào)用對象
    2022-04-04
  • C++詳細分析線程間的同步通信

    C++詳細分析線程間的同步通信

    線程間不通信的話,每個線程受CPU的調(diào)度,沒有任何執(zhí)行上的順序可言,線程1和線程2是根據(jù)CPU調(diào)度算法來的,兩個線程都有可能先運行,是不確定的,線程間的運行順序是不確定的,所以多線程程序出問題,難以復(fù)現(xiàn),本章我們就來了解線程間的同步通信
    2022-05-05
  • Java?C++?算法題解leetcode669修剪二叉搜索樹示例

    Java?C++?算法題解leetcode669修剪二叉搜索樹示例

    這篇文章主要為大家介紹了Java?C++?算法題解leetcode669修剪二叉搜索樹示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Qt創(chuàng)建并顯示柱狀圖的方法

    Qt創(chuàng)建并顯示柱狀圖的方法

    Qt Charts 模塊提供了一套易于使用的圖表組件,本文主要介紹了Qt創(chuàng)建并顯示柱狀圖,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 關(guān)于C++中0是十進制還是八進制的問題

    關(guān)于C++中0是十進制還是八進制的問題

    本篇文章中,小編將為大家介紹關(guān)于C++中0是十進制還是八進制的問題,有需要的朋友可以參考一下
    2013-04-04
  • C語言深入講解內(nèi)存操作問題

    C語言深入講解內(nèi)存操作問題

    程序運行的目的是為了得到特定的結(jié)果,計算機本質(zhì)上是用于計算的,既然是用于計算,就需要參與計算的數(shù)據(jù),那這些數(shù)據(jù)就存儲在內(nèi)存中,計算之前參與運算的數(shù)據(jù)以及運算之后得到的數(shù)據(jù),都存儲在內(nèi)存中,所以對內(nèi)存操作的掌握就尤為重要,下面我們一起來看看
    2022-04-04
  • C++求階乘的兩種方法

    C++求階乘的兩種方法

    這篇文章主要介紹了C++求階乘的兩種方法,有需要的朋友可以參考一下
    2013-12-12
  • C++歸并排序代碼實現(xiàn)示例代碼

    C++歸并排序代碼實現(xiàn)示例代碼

    歸并排序?qū)⒋判驍?shù)組分成兩個子數(shù)組,分別對這兩個子數(shù)組進行排序,然后將排序好的子數(shù)組合并,得到排序后的數(shù)組,這篇文章主要介紹了C++歸并排序代碼實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2025-08-08
  • C語言選擇、循環(huán)、函數(shù)、數(shù)組與操作符

    C語言選擇、循環(huán)、函數(shù)、數(shù)組與操作符

    這篇文章主要介紹了C語言選擇、循環(huán)、函數(shù)、數(shù)組與操作符,文章基于C語言展開對主題的詳細介紹,下文內(nèi)容需要的小伙伴可以參考一下
    2022-04-04

最新評論

靖远县| 武隆县| 芮城县| 南投县| 通化市| 图们市| 西和县| 东兰县| 宁安市| 威远县| 沛县| 平乐县| 郎溪县| 汪清县| 晋江市| 固安县| 奉贤区| 星子县| 丹江口市| 丹江口市| 贡觉县| 通海县| 滦南县| 台湾省| 垣曲县| 花莲市| 临高县| 伊通| 涪陵区| 陆丰市| 朝阳市| 镇江市| 秦安县| 江北区| 静安区| 洪泽县| 柞水县| 双桥区| 崇文区| 新郑市| 云安县|