以下Rust程序使用cargo run
在1.39.0夜间的货物上正常运行:
extern crate serde;
extern crate serde_json;
#[macro_use]
extern crate serde_derive;
use serde_json::Value as JsonValue;
#[derive(Serialize,Deserialize)]
struct JData
{
names: Vec<String>
}
fn main() {
let json_str = r#"
{
"names": ["James", "Carl", "Megan"]
}
"#;
let res = serde_json::from_str(json_str); // res is Result
if res.is_ok()
{
let p: JData = res.unwrap();
println!("{}", p.names[1]);
}
else
{
eprintln!("Sorry, couldn't parse JSON :(");
}
}
但是,如果我将names: Vec<String>
行更改为names: Vec<u8>
,它将失败,并显示此错误:
对不起,无法解析JSON:(
理解,该程序应该失败。但我不明白为什么会到达此行,因为此错误是由于let res = serde_json::from_str(json_str);
的结果而显示的,而该错误与程序的let p: JData = res.unwrap();
步骤无关。换句话说,from_str()
行与随后的尝试解析为JData结构行的尝试无关,但是错误表明from_str()
行失败了,而不是它无法解析为JData
。
res
的类型由编译时的let p: JData
确定,即使控制在运行时从未到达该行。该类型Result<JData, …>
控制serde_json::from_str
的行为,这将导致它无法读取u8
s中的字符串文字。