json - 为什么这个 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
.
解决方案
的类型res
由let p: JData
编译时确定,即使控制在运行时从未到达该行。该类型Result<JData, …>
控制 的行为serde_json::from_str
,这导致它无法将字符串文字读取到u8
s 中。
推荐阅读
- java - 使用 GroupLayout 时出现 InvalidateStateException
- angular - 如何在 ng for 循环中动态创建引导行和列
- r - sapply 返回向量的第一个元素的重复实例,而不是由 R 中的自定义函数计算的所有元素
- node.js - 如何过滤来自 mongoDb 的元数据(对象)中的数据?
- r - 当 NA 时,有条件地对 dygraph 时间序列的区域进行着色
- c - 为什么我需要为字符串分配内存而不是总是只使用指针?
- python - 正则表达式拆分字符串,不包括可转义引号之间的分隔符
- angular - 使用 angular-svg-icon 组件从库的资产中引用 svg 图标
- swift - React Native 应用程序向 SwiftUI 小部件发送数据
- time-complexity - 计算函数的时间复杂度