Rust 如何组合(包括嵌套数组值)两个serde_yaml::Value对象?

Rust 如何组合(包括嵌套数组值)两个serde_yaml::Value对象?,rust,yaml,serde,Rust,Yaml,Serde,我在创建递归函数来解析两个serde_yaml::Value变量并组合它们时遇到了问题。在一个基本级别对象上组合它们很容易,但是子级别值只是组合值的值 鉴于: let original:serde_yaml::Value=serde_yaml::from_str(r#)” 凯亚: 子键a: -A -B -C 键盘:“一” keyC:“a” "# ).unwrap(); 让我们添加或修改这些值:serde_yaml::Value=serde_yaml::from_str(r#)” 凯亚: 子键a:

我在创建递归函数来解析两个serde_yaml::Value变量并组合它们时遇到了问题。在一个基本级别对象上组合它们很容易,但是子级别值只是组合值的值

鉴于:

let original:serde_yaml::Value=serde_yaml::from_str(r#)”
凯亚:
子键a:
-A
-B
-C
键盘:“一”
keyC:“a”
"#
).unwrap();
让我们添加或修改这些值:serde_yaml::Value=serde_yaml::from_str(r#)”
凯亚:
子键a:
-D
子关键字b:
-BA
键盘:“两个”
keyC:
-A
-B
"#
).unwrap();
我将如何组合它们,以便考虑所有嵌套属性,例如:

keyA:
子键a:
-A
-B
-C
-D
子关键字b:
-BA
键盘:“两个”
keyC:
-A
-B
当出现复杂情况时(例如,不同的值类型,如keyC),我更喜欢用新的值类型覆盖原始值类型

编辑:我在这里也看到了一个关于json的类似问题:
但该合并方法不会合并数组值,只会覆盖。

编辑:标记正确答案。将把这个留给JSON版本。


json版本:

fn合并(a:&mut-serde_-json::Value,b:serde_-json::Value){
比赛(a,b){
(a@&mut serde_json::Value::Object(_),serde_json::Value::Object(b))=>{
设a=a.as_object_mut().unwrap();
对于b中的(k,v){
如果v.is_array()&&a.contains_key(&k)&&a.get(&k).as_ref().unwrap().is_array(){
让mut_a=a.get(&k).unwrap().as_array().unwrap().to_owned();
_a、 附加(&mut v.as_array().unwrap())到_owned());
a[&k]=serde_json::Value::from(_a);
}
否则{
合并(a.entry(k).或插入(serde_json::Value::Null),v);
}
}
}
(a,b)=>*a=b,
}
}

我已经计算出下面的转换(可能需要一些清理):

fn merge_yaml(a:&mut serde_yaml::Value,b:serde_yaml::Value){
比赛(a,b){
(a@&mut serde_yaml::Value::Mapping(_),serde_yaml::Value::Mapping(b))=>{
设a=a.as_mapping_mut().unwrap();
对于b中的(k,v){
如果v.is_sequence()&&a.contains_key(&k)&&a[&k],is_sequence(){
让mut_b=a.get(&k).unwrap().as_sequence().unwrap().to_owned();
_b、 附加(&mut v.as_sequence().unwrap())到_owned());
a[&k]=serde_yaml::Value::from(_b);
继续;
}
如果!a.包含_键(&k){a.insert(k.to_owned(),v.to_owned());}
else{merge_yaml(&mut a[&k],v);}
}
}
(a,b)=>*a=b,
}
}