如何解码具有Rust关键字属性名的JSON对象?

如何解码具有Rust关键字属性名的JSON对象?,json,rust,Json,Rust,我想知道是否有可能在Rust中解码一个JSON对象,该对象的属性名也是Rust关键字。我正在使用rustc序列化板条箱,我的结构定义如下所示: #[derive(RustcDecodable)] struct MyObj { type: String } #[derive(Deserialize)] struct MyObj { #[serde(rename = "type")] type_name: String } 编译器抛出错误,因为type是关键字。确切的编译器

我想知道是否有可能在Rust中解码一个JSON对象,该对象的属性名也是Rust关键字。我正在使用rustc序列化板条箱,我的结构定义如下所示:

#[derive(RustcDecodable)]
struct MyObj {
  type: String
}
#[derive(Deserialize)]
struct MyObj {
    #[serde(rename = "type")] 
    type_name: String
}
编译器抛出错误,因为type是关键字。确切的编译器错误消息是:

error: expected identifier, found keyword `type`
src/mysrc.rs:23     type: String,
                           ^~~~
对不起,我刚开始尝试生锈。你可以用这个板条箱。它支持重命名字段

您的示例可以如下所示:

#[derive(RustcDecodable)]
struct MyObj {
  type: String
}
#[derive(Deserialize)]
struct MyObj {
    #[serde(rename = "type")] 
    type_name: String
}

假设无法更改原始数据以避免冲突是否安全?是的,如果不必更改源数据,这将是最好的。我想也许用不同的名称创建一个新的struct字段并编写一个自定义的
impl-Decodable
是唯一的方法?我可以看到手动实现它,或者使用
Json::from_str
,然后插入它的结果值。看起来正是我想要的。它说它做了一些前瞻性的工作,你知道是否有可能解析一个可能是几种不同类型之一的属性吗?因此,名为msg的字段可以是JSON字符串或数组。这是发明serde的主要原因之一,因为旧的反序列化程序在没有事先读取标记的情况下无法读取枚举。太棒了。谢谢你的帮助。