为什么JSON解析在Rust中的指定位置失败?

问题描述 投票:0回答:1

以下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

json rust serde
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.