Rust 有没有办法将Serde映射转换为值?

Rust 有没有办法将Serde映射转换为值?,rust,serde,Rust,Serde,根据Serde规范,对象/映射是一个值: pub enum Value { Null, Bool(bool), Number(Number), String(String), Array(Vec<Value>), Object(Map<String, Value>), } pub枚举值{ 无效的 布尔(布尔), 编号(编号),, 串(串),, 阵列(Vec), 对象(地图), } 然而,当我编译这段代码时: extern

根据Serde规范,
对象
/
映射
是一个

pub enum Value {
    Null,
    Bool(bool),
    Number(Number),
    String(String),
    Array(Vec<Value>),
    Object(Map<String, Value>),
}
pub枚举值{
无效的
布尔(布尔),
编号(编号),,
串(串),,
阵列(Vec),
对象(地图),
}
然而,当我编译这段代码时:

extern crate serde;
#[macro_use]
extern crate serde_json;

#[derive(Debug)]
struct Wrapper {
    ok: bool,
    data: Option<serde_json::Value>,
}

impl Wrapper {
    fn ok() -> Wrapper {
        Wrapper {
            ok: true,
            data: None,
        }
    }

    pub fn data(&mut self, data: serde_json::Value) -> &mut Wrapper {
        self.data = Some(data);
        self
    }

    pub fn finalize(self) -> Wrapper {
        self
    }
}

trait IsValidWrapper {
    fn is_valid_wrapper(&self) -> bool;
}

impl IsValidWrapper for serde_json::Map<std::string::String, serde_json::Value> {
    fn is_valid_wrapper(&self) -> bool {
        self["ok"].as_bool().unwrap_or(false)
    }
}

fn main() {
    let json = json!({
          "name": "John Doe",
          "age": 43,
          "phones": [
            "+44 1234567",
            "+44 2345678"
          ]
        });

    let converted_json: Wrapper = json
        .as_object()
        .map_or_else(
            || Err(json),
            |obj| {
                if obj.is_valid_wrapper() {
                    Ok(Wrapper::ok().data(obj["data"].clone()).finalize())
                } else {
                    Err(*obj as serde_json::Value)
                }
            },
        )
        .unwrap_or_else(|data| Wrapper::ok().data(data.clone()).finalize());
    println!(
        "org json = {:?} => converted json = {:?}",
        json, converted_json
    );
}
extern板条箱系列;
#[宏_使用]
外部板条箱serde_json;
#[导出(调试)]
结构包装器{
好的,布尔,
数据:选项,
}
impl包装器{
fn ok()->Wrapper{
包装纸{
好的,没错,
数据:无,
}
}
pub fn data(&mut self,data:serde_json::Value)->&mut包装器{
self.data=一些(数据);
自己
}
pub fn finalize(self)->包装器{
自己
}
}
特征是有效的说唱者{
fn是有效的包装器(&self)->bool;
}
用于serde_json::Map的impl IsValidWrapper{
fn是有效的包装器(&self)->bool{
self[“ok”]。as_bool()。展开或(false)
}
}
fn main(){
让json=json({
“姓名”:“约翰·多伊”,
“年龄”:43岁,
“电话”:[
"+44 1234567",
"+44 2345678"
]
});
让我们转换为json:Wrapper=json
.as_object()
.映射或其他(
||Err(json),
|obj|{
如果对象是有效的包装器(){
确定(包装器::确定().data(obj[“data”].clone()).finalize())
}否则{
错误(*对象为serde_json::Value)
}
},
)
.unwrap_或_else(| data | Wrapper::ok().data(data.clone()).finalize());
普林顿(
“org json={:?}=>转换的json={:?}”,
json,转换为
);
}
我得到这个错误:

error[E0605]:非原语强制转换:`serde_json::Map`as`serde_json::Value`
-->src/main.rs:60:25
|
60 | Err(*obj as serde|u json::Value)
|                         ^^^^^^^^^^^^^^^^^^^^^^^^^
|
=注意:`as`表达式只能用于在基元类型之间转换。考虑使用“从”特性
有没有办法将
映射
向下转换为

对象
/
映射
是一个

不,不是<代码>值是一种类型<代码>地图是一种类型<代码>值::对象是枚举变量,不是单独的类型。在本例中,
Value::Object
保存另一个类型为
Map
的值。必须将值包装在变量中才能转换类型:

Err(serde_json::Value::Object(obj))
这将导致出现以下问题:

错误[E0308]:类型不匹配
-->src/main.rs:57:55
|
57 | Err(serde|u json::Value::Object(obj))
|^^^应为结构“serde_json::Map”,找到引用
|
=注意:应为'serde_json::Map'类型`
找到类型“%serde_json::Map”`
as_object
返回对所包含对象(如果存在)的引用,而不是值本身。您现在需要对其进行
匹配

let converted_json = match json {
    serde_json::Value::Object(obj) => {}
    _ => {}
};
大概是这样的:

let converted_json = match json {
    serde_json::Value::Object(obj) => {
        if obj.is_valid_wrapper() {
            let mut w = Wrapper::ok();
            w.data(obj["data"].clone());
            Ok(w.finalize())
        } else {
            Err(serde_json::Value::Object(obj))
        }
    }
    other => Err(other),
};

Map
不是
Value
,你试过
Err(Value::Object(obj))
?@LukasKalbertodt我把我的第一篇帖子编辑成asked@tafia似乎有效。我得到了一些更多的编译器错误重新移动和借用,我会研究,但至少编译器的问题已经消失了。实际上,映射不是一个值,而是一个值::对象;谢谢你指出这一点