You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两个包含嵌套数组值的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 03:54:05