首页 > 解决方案 > 如何在 Rust 中组合来自不同库的类型?

问题描述

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

swtweb 的Value

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

serde-json 的Value

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

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

标签: rust

解决方案


查看 的文档stdweb::Value,似乎他们已经涵盖了您!

TryFrom<JsonValue>JsonValue的别名来实现serde_json::Value,因此这使您可以从 转换serde_json::Valuestdweb::Value

它实现Serialize,并serde_json::to_value允许您将实现的任何类型转换Serializeserde_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);

推荐阅读