Rust和JSON序列化

时间:2016-03-04 21:09:53

标签: json serialization rust

如果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")})
}
  1. 有没有办法指定结构中的某些字段是可选的?
  2. 为什么函数from_str没有将mtype序列化为枚举?

2 个答案:

答案 0 :(得分:3)

关于第一个问题,您可以使用Option。例如:

pub struct JMessage {
    msg_type: Option<String>,
    mtype: MessageType,
}

如果该字段不存在,则为defaults to None

答案 1 :(得分:2)

  1. 不,没有这样的方法。为此,您需要使用serde。 Serde还有许多其他功能,但遗憾的是它不像Rustc_serialize那样容易使用稳定的Rust。

  2. 那该怎么办? Json::from_str返回一个JSON AST,它由地图,数组,字符串,数字和其他JSON类型组成。它根本不能包含枚举值。此外,没有办法表明你想要一些其他类型而不是字符串。