6 个版本
0.1.4 | 2023 年 10 月 19 日 |
---|---|
0.1.3 | 2023 年 10 月 18 日 |
0.0.2 | 2023 年 10 月 18 日 |
405 在 编码
每月 496 次下载
14KB
130 行
serde_json_path_to_error
这是一个用 serde_json 替换,并通过 serde_path_to_error 增强了错误。
这通常是更好的默认设置,因为它使得在序列化或反序列化失败时更容易调试。路径在您的模式很大或难以看到导致错误的原始数据时特别有用。
这个 crate 提供了与 serde_json 相同的项,只是具有不同的错误类型。有关更详细的文档,请参阅 serde_json。
从 serde_json 迁移
要丰富您的错误,只需将 serde_json 的依赖项替换为 serde_json_path_to_error。
- serde_json = "1.0"
+ serde_json = { package = "serde_json_path_to_error", version = "0.1" }
或者,您可以添加 serde_json_path_to_error 作为常规依赖...
# cargo add serde_json_path_to_error
..并将您的 crate 根目录中的 crate 重命名为与 serde_json 兼容的 API。
extern crate serde_json_path_to_error as serde_json;
在大多数情况下,迁移后项目应该继续编译。现在,您的错误将包含额外的上下文,显示序列化和反序列化失败的位置。
// the rename trick shown above
extern crate serde_json_path_to_error as serde_json;
# use std::collections::BTreeMap as Map;
# use serde::Deserialize;
#[derive(Deserialize)]
struct Package {
name: String,
dependencies: Map<String, Dependency>,
}
#[derive(Deserialize)]
struct Dependency {
version: String,
}
fn main() {
let j = r#"{
"name": "demo",
"dependencies": {
"serde": {
"version": 1
}
}
}"#;
// Uses the enriched version from [serde_json_path_to_error] but with the exact same API
// you've come to expect from [serde_json]
let result: Result<Package, _> = serde_json::from_str(j);
match result {
Ok(_) => panic!("expected a type error"),
Err(err) => {
// You get the error including the path as a default
assert_eq!(
err.to_string(),
"dependencies.serde.version: invalid type: integer `1`, expected a string at line 5 column 28",
);
// You can get just the path
assert_eq!(
err.path().to_string(),
"dependencies.serde.version",
);
// Or just the original serde_json error
assert_eq!(
err.into_inner().to_string(),
"invalid type: integer `1`, expected a string at line 5 column 28",
);
}
}
}
注意事项
仍然有一些项目不返回丰富的错误。我愿意接受这些项目的 PR。
依赖
~0.4–0.8MB
~19K SLoC