如何合并两个包含嵌套数组值的serde_yaml::Value对象
实现方案
合并规则
- 两个值均为YAML对象(Mapping类型)时,递归合并键值对:新键直接新增,已存在的键对应值递归合并
- 两个值均为YAML数组(Sequence类型)时,将新数组元素全部追加到旧数组末尾
- 其余所有场景(类型冲突、基础类型值更新)直接用新值覆盖旧值
完整实现代码
首先在Cargo.toml中添加依赖:
[dependencies] serde_yaml = "0.9"
Rust实现代码:
use serde_yaml::{Mapping, Value}; fn merge_yaml(original: &mut Value, new: Value) { match (original, new) { // 嵌套对象递归合并 (Value::Mapping(old_map), Value::Mapping(new_map)) => { for (key, new_val) in new_map { if let Some(old_val) = old_map.get_mut(&key) { merge_yaml(old_val, new_val); } else { old_map.insert(key, new_val); } } } // 同类型数组合并 (Value::Sequence(old_seq), Value::Sequence(mut new_seq)) => { old_seq.append(&mut new_seq); } // 类型冲突或基础类型直接覆盖 (original_val, new_val) => { *original_val = new_val; } } } fn main() { let mut original: Value = serde_yaml::from_str(r#" keyA: subKeyA: - A - B - C keyB: "one" keyC: "a" "#).unwrap(); let add_or_modify_these_values: Value = serde_yaml::from_str(r#" keyA: subKeyA: - D subKeyB: - BA keyB: "two" keyC: - A - B "#).unwrap(); merge_yaml(&mut original, add_or_modify_these_values); println!("{}", serde_yaml::to_string(&original).unwrap()); }
输出结果
运行代码后输出的YAML完全符合需求:
keyA: subKeyA: - A - B - C - D subKeyB: - BA keyB: "two" keyC: - A - B
内容的提问来源于stack exchange,提问作者R. StackUser
相关产品推荐
相关产品推荐

