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

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

  • 一、Hjson-Cpp簡介
    • Hjson-Cpp簡介
    • 核心特性
    • 安裝與集成
    • 基本用法示例
    • 常用API說明
    • 與JSON互轉
    • 錯誤處理
    • 性能建議
    • 高級特性
      • 1. 類型安全訪問
      • 2. 文件操作
      • 3. 自定義解析規則
  • 二、使用教程
    • 下載
    • 使用

一、Hjson-Cpp簡介

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.3features: ["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 DEFAULTshowImages: truewriteImages: trueprintFrameIndex: falseprintFrameRate: 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;
}

運行查看結果:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84041.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84041.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84041.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

單例模式的好處

為什么要使用單例模式 1.資源管理&#xff1a; 唯一性&#xff1a;某些資源在整個應用程序中只需要一個實例&#xff0c;例如日志記錄器、配置管理器、數據庫連接池等。單例模式可以確保這些資源的唯一性&#xff0c;避免重復創建和管理。 全局訪問&#xff1a;單例模式提供了…

LangChain 結構化輸出指南

LangChain 結構化輸出指南 概述 對于許多應用程序&#xff08;如聊天機器人&#xff09;&#xff0c;模型需要直接用自然語言回應用戶。然而&#xff0c;在某些場景下&#xff0c;我們需要模型以結構化格式輸出。例如&#xff0c;我們可能希望將模型輸出存儲在數據庫中&#…

探究webView與html的通訊

最近出來個新需求&#xff1a; 需求描述&#xff1a; 將uniapp的代碼打包成一個app&#xff0c;并實現原本的功能。 原uniapp是一個H5項目&#xff0c;主要的步驟流程是上傳用戶的身份證進行二要素認證&#xff0c;成功后再進行三方活體認證&#xff0c;然后三方回跳到項目中的…

高級定時器TIM1、TIM8

高級定時器在通用定時器的基礎上增加了一些功能&#xff0c;如&#xff1a;重復計數器、帶死區控制的互補輸出通道、斷路輸入等。 捕獲/比較通道的輸出部分(通道1至3) 捕獲/比較通道的輸出部分(通道4) ①重復計數器RCR 基本和通用定時器發生溢出時&#xff0c;會直接生成更新時…

搭建簡易采購系統:從需求分析到供應商數據庫設計

一、需求分析框架&#xff08;4大核心模塊&#xff09; 關鍵需求清單&#xff1a; 需求提報&#xff08;含審批流&#xff09; 供應商準入與評估 比價與訂單生成 基礎報表功能 二、技術選型方案 組件推薦方案替代方案前端框架Vue.js ElementUIReact Ant Design后端語言P…

基于LSTM-GARCH混合模型的“獲利了結”量化解析:黃金單日1.27%跌幅的技術性歸因

摘要&#xff1a;本文通過多維度量化指標、結合地緣風險溢價因子、貨幣政策預期指數及貿易摩擦不確定性指數&#xff0c;構建動態情景分析框架。 一、黃金價格技術面解析 周一&#xff08;6月16日&#xff09;現貨黃金呈現"沖高回落-獲利了結"典型特征&#xff0c;日…

【AI】Spring AI Alibaba 的介紹

目錄 一、Spring AI Alibaba 的介紹 1.1 什么是 Spring AI Alibaba&#xff1f; 1.2 Spring AI 項目簡介 二、核心概念 2.1 模型 2.2 提示&#xff08;Prompt&#xff09; 2.3 提示詞模板&#xff08;Prompt Template&#xff09; 2.4 嵌入&#xff08;Embedding&#x…

從main()函數的執行發散開來

大多數程序員的第一行代碼可能都是從輸出“Hello&#xff0c;World!開始的吧。如果請你寫一個c程序&#xff0c;在屏幕上打印“Hello&#xff0c;World!”&#xff0c;下面的代碼對擁有扎實編程基本功的你而言肯定so easy&#xff1a; #include <stdio.h>int main() {pr…

(16)java+ selenium->自動化測試-元素定位之By xpath下篇

1.簡介 老規矩,我們還是接著前面兩篇的Xpath 5.自動測試實戰 以百度首頁為例,將xpath的各種定位方法一一講解和分享一下。 5.1大致步驟 1.訪問百度首頁。 2.通過xpath定位到元素,點擊一下。 5.2模糊定位starts-with關鍵字 有一種特殊的情況:頁面元素的屬性值會被動態…

45-Oracle 索引的新建與重建

小伙們日常里有沒有被業務和BOSS要求新建索引或是重建索引&#xff1f;他們都想著既快又穩&#xff0c;那么索引在在Oracle上如何實現、新建、重建。原則是什么&#xff1a; 1、新建索引&#xff0c;查詢是否高頻且慢&#xff0c;索引列是否高選擇性&#xff0c;新增索引對寫負…

使用 Rust Clippy 的詳細方案

使用 Rust Clippy 的詳細方案 Rust Clippy 是一個強大的靜態分析工具&#xff0c;幫助開發者識別代碼中的潛在問題并改善代碼質量。以下是如何充分利用 Clippy 的方法&#xff1a; 安裝 Clippy 確保 Rust 工具鏈已安裝。通過以下命令安裝 Clippy&#xff1a; rustup compon…

21.什么是JSBridge(1)

1.Native與H5交互的常用交互機制&#xff0c;主流選擇是jsbridge 2.jsbridge是什么&#xff1f; JSBridge 是 Android 官方 WebView 提供的 addJavascriptInterface() 能力 項目方&#xff08;或三方庫&#xff09;封裝的橋梁通信協議。 底層機制由 Android 官方 WebView 提…

什么是Flink

Apache Flink&#xff1a;流批一體的大數據處理引擎 什么是Apache Flink&#xff1f; Apache Flink是一個開源的分布式流處理框架&#xff0c;最初由柏林工業大學開發&#xff0c;后成為Apache軟件基金會的頂級項目。它能夠以高吞吐、低延遲的方式處理無界數據流(流處理)和有…

區塊鏈+智能合約如何解決上門按摩行業的信任問題?——App開發案例

你是不是覺得上門按摩市場已經人滿為患&#xff1f;擔心自己入局太晚或者缺乏行業經驗&#xff1f;一組真實數據可能會讓你改變看法&#xff1a;全國按摩服務需求正以月均8%的速度迅猛增長&#xff0c;但專業技師的供給量僅能跟上5%的增幅&#xff01;這意味著每個月都有相當于…

修改windows hosts文件的軟件

修改hosts文件的軟件推薦及使用教程 這個軟件我用了10多年 推薦工具&#xff1a;Hosts Host軟件不用安裝綠色 如何使用 注意事項 如何沒有安裝.net 3.5 請根據提示安裝就可以了 內容綁定了軟件下載資源&#xff0c;在頂部有需要的自己取

Java web非Maven項目中引入EasyExcel踩坑記錄

最近在幫朋友在老項目上做二次開發&#xff0c;有讀取Excel的需求&#xff0c;習慣性的引入了EasyExcel&#xff0c;但是出現了很多問題&#xff0c;最主要就是jar包的問題,需要依賴的jar包版本問題 項目技術棧&#xff1a; tomcat9 Amazon Corretto JDK 8 (亞馬遜的openJDK…

Flutter——數據庫Drift開發詳細教程(七)

目錄 入門設置 漂移文件入門變量數組定義表支持的列類型漂移特有的功能 導入嵌套結果LIST子查詢Dart 互操作SQL 中的 Dart 組件類型轉換器現有的行類Dart 文檔注釋 結果類名稱支持的語句 入門 Drift 提供了一個dart_api來定義表和編寫 SQL 查詢。尤其當您已經熟悉 SQL 時&#…

【排坑指南】MySQL初始化后,Nacos與微服務無法連接??

Date&#xff1a;2025/06/18 你好&#xff01; 今天&#xff0c;分享一個工作中遇到的一個 MySQL 問題。在這之前都不知道是 MySQL 的問題&#xff0c;特離譜&#xff01; 昨天和今天大多數時間都用來處理了這一個問題&#xff1a;《MySQL進行了數據庫初始化之后&#xff0c…

springboot獲取工程目錄

在springboot中使用ApplicationHome獲取工程所在目錄的時候&#xff0c;開發環境和生產運行環境輸出的目錄是不同的&#xff0c;開發環境到target/classes目錄&#xff0c;而生產運行則是需要的wzkj-server.jar所在目錄 ApplicationHome home new ApplicationHome(CollectTas…

深入ZGC并發處理的原理

大型Java應用的核心痛點之一&#xff1a;當JVM進行垃圾回收時強制程序暫停&#xff08;STW&#xff09;的代價。在要求低延遲的應用場景——高頻交易系統、實時在線服務或全球性大型平臺——中&#xff0c;這種"時空靜止"的成本可能極高。但JDK從16版本&#xff08;生…