前言
YAML(Yet Another Markup Language)是一種人類可讀的(de)(de)(de)數據(ju)序列(lie)化格(ge)式,常用于(yu)(如K8S及Ansible)配置文件和數據(ju)交換(huan)。在C語言(yan)中,我們可以使用libyaml來(lai)解(jie)析和處(chu)理YAML格(ge)式的(de)(de)(de)數據(ju), libcyaml 是基于(yu)libyaml 封裝的(de)(de)(de)基于(yu)schema的(de)(de)(de)YAML解(jie)析和序列(lie)化工具, 基于(yu)ISC協議開源(yuan),用戶能(neng)夠方便集成到業務(wu)代(dai)碼(ma)。本文將介紹如何使用libcayml實(shi)現解(jie)析YAML到結構體(ti)。
前置準備
1.    安裝依賴包
libcayml 基于libyaml作為底層的YAML讀(du)寫庫,因此需(xu)要安裝libyaml及其(qi)開(kai)發庫,否則在編譯時將出(chu)現錯誤(wu)。
| $ yum install -y libyaml libyaml-devel | 
2. 下載(zai)代碼
| git clone github.com/tlsa/libcyaml.git lib cd lib git clone v1.4.1 -b v1.4.1 | 
項目集成
1.    打開調試開關
在項目中,通常需要(yao)打開調試(shi)便于后期(qi)問題(ti)定位,因此修改Makefile打開編譯調試(shi)開關
| diff --git a/Makefile b/Makefile  # Default variant depends on whether it's a development build.  ifneq ($(filter coverage,$(MAKECMDGOALS)),) | 
2.    代碼開發
參考代碼倉庫中examples/planner/main.c 進行代碼開發:
定義結構體
| struct task {     const char **depends;     const char **people; | 
定義結構(gou)體對應的schema:
| static const cyaml_schema_field_t task_fields_schema[] = { static const cyaml_schema_value_t task_schema = { | 
如果結(jie)構(gou)體作為另外一(yi)個結(jie)構(gou)體的成員, 可以參考plan的相關定(ding)義:
| struct plan { … struct task *tasks; uint64_t tasks_count; }; | 
 
Schema定義:
| static const cyaml_schema_field_t plan_fields_schema[] = { … CYAML_FIELD_SEQUENCE( "tasks", CYAML_FLAG_POINTER, struct plan, tasks, &task_schema, 0, CYAML_UNLIMITED), … }; | 
YAML 配置
| static const cyaml_config_t config = { .log_fn = cyaml_log, .mem_fn = cyaml_mem, .log_level = CYAML_LOG_INFO, }; | 
這里使用默認的日志及內存分配函數,如有需要可實現自定義的方法。
解析yaml文件到結構體
| err = cyaml_load_file(argv[ARG_PATH_IN], &config, &plan_schema, (void **) &plan, NULL); | 
序(xu)列化(hua)結(jie)構體(ti)并寫(xie)到文(wen)件:
| err = cyaml_save_file(argv[ARG_PATH_OUT], &config, &plan_schema, plan, 0); | 
最后,別記得釋放內存:
| cyaml_free(&config, &plan_schema, plan, 0); | 
編譯libcayml到源碼(ma)
| CFLAGS += -I lib/include LIBS = -lyaml -Llib -lcyaml OBJS = main.o all: libs $(TARGET) libs: $(TARGET): $(OBJS) | 
執(zhi)行make命(ming)令即(ji)能(neng)完成代碼編譯。
總結
YAML是一(yi)種方便人類(lei)閱讀和編寫(xie)的數(shu)據序列化格式,在(zai)C語(yu)言中(zhong)可以(yi)(yi)使用(yong)libyaml庫來解析和處(chu)理YAML格式的數(shu)據。本文介紹了如何使用(yong)基于libyaml封裝的開源libcyaml庫,以(yi)(yi)及如何使用(yong)libcyaml庫來加載、解析和處(chu)理YAML文件(jian)。