首页 > 解决方案 > 为什么这个 JSON 解析在 Rust 的指定位置失败?

问题描述

以下 Rust 程序cargo run在 cargo 1.39.0-nightly 上运行良好:

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.

标签: jsonrustserde

解决方案


的类型reslet p: JData编译时确定,即使控制在运行时从未到达该行。该类型Result<JData, …&gt;控制 的行为serde_json::from_str,这导致它无法将字符串文字读取到u8s 中。


推荐阅读