如何在Rust中合并来自不同库的类型?

时间:2018-07-02 15:48:47

标签: rust

我正在使用Rust库swtweb(用于与JavaScript交互)和serde-json(用于JSON)。两者都有一种Value类型来表示非常相似的JavaScript对象:

swtweb's Value

#[derive(Clone, PartialEq, Debug)]
pub enum Value {
    Undefined,
    Null,
    Bool(bool),
    Number(Number),
    Symbol(Symbol),
    String(String),
    Reference(Reference)
}

serde-json's Value

#[derive(Clone, PartialEq)]
pub enum Value {
    Null,
    Bool(bool),
    Number(Number),
    String(String),
    Array(Vec<Value>),
    Object(Map<String, Value>),
}

将一种类型的实例转换为另一种类型的方法是什么?是否可以在不修改库的情况下得出一个共同的特征?

1 个答案:

答案 0 :(得分:1)

看着stdweb::Value的文档,看来他们已经涵盖了您!

它实现了TryFrom<JsonValue>,其中JsonValueserde_json::Value的别名,因此,您可以从serde_json::Value转换为stdweb::Value

它实现了Serialize,而serde_json::to_value使您可以将实现Serialize的任何类型转换为serde_json::Value

所以这应该起作用:

let json_value: serde_json::Value = json!("my value");
println!("{:#?}", json_value);

let stdweb_value: stdweb::Value = stdweb::Value::try_from(json_value).unwrap();
println!("{:#?}", stdweb_value);

let json_value_again: serde_json::Value = serde_json::to_value(stdweb_value).unwrap();
println!("{:#?}", json_value_again);