Почему этот анализ JSON не выполняется в указанном месте в Rust? - PullRequest
1 голос
/ 02 октября 2019

Следующая программа Rust работает нормально, используя cargo run для груза 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);, который не имеет никакого отношения к шагу программы * 1014. * Другими словами, строка from_str() не зависит от последующей попытки разбора на строку структуры JData, но ошибка указывает, чтоошибка линии from_str(), не то чтобы она не могла разобраться в JData.

1 Ответ

3 голосов
/ 02 октября 2019

Тип res определяется let p: JData во время компиляции, даже если элемент управления никогда не достигает этой строки во время выполнения. Этот тип, Result<JData, …>, управляет поведением serde_json::from_str, что приводит к сбою при чтении строковых литералов в u8 с.

...