如果JSON对象缺少某些字段,decode
函数会抛出异常。例如:
extern crate rustc_serialize;
use rustc_serialize::json;
use rustc_serialize::json::Json;
#[derive(RustcDecodable, RustcEncodable, Debug)]
enum MessageType {
PING,
PONG,
OPT,
}
#[derive(RustcDecodable, RustcEncodable, Debug)]
pub struct JMessage {
msg_type: String,
mtype: MessageType,
}
fn main() {
let result3 = json::decode::<JMessage>(r#"{"msg_type":"TEST"}"#);
println!("{:?}", result3);
// this will print `Err(MissingFieldError("mtype"))`
let result = json::decode::<JMessage>(r#"{"msg_type":"TEST", "mtype":"PING"}"#);
println!("{:?}", &result);
// This will print Ok(JMessage { msg_type: "TEST", mtype: PING })
let result2 = Json::from_str(r#"{"msg_type":"TEST", "mtype":"PING"}"#).unwrap();
println!("{:?}", &result2);
// this will print Object({"msg_type": String("TEST"), "mtype": String("PING")})
}
from_str
没有将mtype
序列化为枚举? 答案 0 :(得分:3)
关于第一个问题,您可以使用Option
。例如:
pub struct JMessage {
msg_type: Option<String>,
mtype: MessageType,
}
如果该字段不存在,则为defaults to None
。
答案 1 :(得分:2)
不,没有这样的方法。为此,您需要使用serde。 Serde还有许多其他功能,但遗憾的是它不像Rustc_serialize那样容易使用稳定的Rust。
那该怎么办? Json::from_str
返回一个JSON AST,它由地图,数组,字符串,数字和其他JSON类型组成。它根本不能包含枚举值。此外,没有办法表明你想要一些其他类型而不是字符串。