如何使用Rust关键字属性名称解码JSON对象?

18

我在想是否可以在Rust中解码一个具有与Rust关键字相同的属性名称的JSON对象。我正在使用rustc-serialize创建,并且我的结构定义如下:

#[derive(RustcDecodable)]
struct MyObj {
  type: String
}
编译器发生错误,因为 type 是一个关键字。
error: expected identifier, found keyword `type`
src/mysrc.rs:23     type: String,
                           ^~~~

可以假设原始数据不会被更改以避免冲突吗? - Shepmaster
是的,最好不要改变源数据。我猜也许创建一个新的结构体字段并编写自定义的 impl Decodable 是唯一的方法? - rking788
我可以手动实现它,也可以使用 Json::from_str 然后深入其结果值。 - Shepmaster
2个回答

27
你可以使用serde包。它支持字段重命名自2015年2月以来
然后,你的示例可能看起来像这样:
#[derive(Deserialize)]
struct MyObj {
    #[serde(rename = "type")] 
    type_name: String
}

1
看起来正是我在寻找的东西。它说它可以进行一些前瞻,你知道是否可能解析一个属性,该属性可以是几种不同类型之一吗?因此,名为msg的字段可以是JSON字符串或数组。 - rking788
这是 serde 被发明的主要原因之一,因为旧的反序列化器在未事先读取标签的情况下无法读取枚举。 - oli_obk
太棒了。谢谢你的帮助。 - rking788

1

可以使用原始标识符来完成此操作,而无需使用serde的字段重命名。通过在标识符前添加r#,可以使用关键字名称。

使用rustc-serialize

#[derive(RustcDecodable)]
struct MyObj {
    r#type: String
}

使用serde

use serde::Deserialize;

#[derive(Deserialize)]
struct MyObj {
    r#type: String
}

请注意,rustc-serialize已被弃用,推荐使用serde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接