1

serde_json我正在尝试使用Rust解析一段 json 字符串。我想使用以下语法匹配解析的结果:

match serde_json::from_str(msg.to_text().unwrap()) {
    Ok(result) => {
        println!("Parsed: {}", response.text);
    }
    Err(error) => {
        println!("Failed to parse: {}", error);
    }
}

但是编译器向我抱怨他不知道的类型,result当然,他是对的。但是我怎么能告诉他的类型result呢?我尝试了以下代码,但它也没有工作。所以我想在匹配臂中表达变量的类型。

match serde_json::from_str(msg.to_text().unwrap()) {
    Ok(result: Response) => {
        println!("Parsed: {}", response.text);
    }
    Err(error) => {
        println!("Failed to parse: {}, {}", error, msg.to_text.unwrap());
    }
}
4

1 回答 1

3

有几种方法可以指定类型。您可以在函数调用中使用类型参数明确指定它,即使用此语法func::<T>()

match serde_json::from_str::<Response>(json) {
    Ok(response) => {}
    Err(err) => {}
}

或者,您可以将初始结果分配给变量,并在那里提示类型,即

let res: Result<Response, _> = serde_json::from_str(json);
match res {
    Ok(response) => {}
    Err(err) => {}
}

或者

match serde_json::from_str(json) {
    Ok(response) => {
        let response: Response = response;
    }
    Err(err) => {}
}

最后,您还可以使用@bindings。但是,如果您的类型是 ,这将不起作用enum,因为您必须指定所需的确切变体。

如,如果Response是,enum你可以有多个Ok(resp @ Response::???)匹配臂。但是你不能有一个Ok(resp @ Response)火柴臂。

match serde_json::from_str(json) {
    Ok(response @ Response { .. }) => {}
    Err(err) => {}
}
于 2021-11-03T06:51:40.013 回答