#serde-json #json #json-error #json-path #serialization #serde #debugging

serde_json_path_to_error

用于替换 serde_json,其中默认提供详细错误

6 个版本

0.1.4 2023 年 10 月 19 日
0.1.3 2023 年 10 月 18 日
0.0.2 2023 年 10 月 18 日

405编码

Download history 411/week @ 2024-03-14 66/week @ 2024-03-21 198/week @ 2024-03-28 290/week @ 2024-04-04 198/week @ 2024-04-11 268/week @ 2024-04-18 197/week @ 2024-04-25 69/week @ 2024-05-02 236/week @ 2024-05-09 129/week @ 2024-05-16 223/week @ 2024-05-23 103/week @ 2024-05-30 150/week @ 2024-06-06 133/week @ 2024-06-13 95/week @ 2024-06-20 94/week @ 2024-06-27

每月 496 次下载

MIT/Apache

14KB
130

serde_json_path_to_error

License Latest version Latest Docs downloads-badge

API 文档

这是一个用 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