12 个版本 (6 个重大变更)
0.7.0 | 2021年9月16日 |
---|---|
0.6.0 | 2021年3月14日 |
0.5.0 | 2020年12月25日 |
0.4.1 | 2020年9月8日 |
0.1.1 | 2017年4月21日 |
#1123 in 编码
每月下载量 78
105KB
2.5K SLoC
json_typegen - 从 JSON 样本生成 Rust 类型
json_typegen 是一个工具集合,用于从 JSON 样本为 Rust、Kotlin 和 TypeScript 生成类型。也就是说,您给它一些 JSON,它会为您生成在程序中使用该 JSON 所必需的类型定义。
此代码生成逻辑有三个接口
过程宏
在 Rust 中,可以使用过程宏直接在您正在制作的程序中使用代码生成。
对于熟悉 F# 的人来说,过程宏 json_typegen!
在 Rust 中作为 JSON 的 类型提供程序 使用。它受到了 F# Data 的启发,并使用了相同的推理算法。
以下示例代码基于内联样本生成类型 Point
。
use json_typegen::json_typegen;
json_typegen!("Point", r#"{ "x": 1, "y": 2 }"#);
fn main() {
let mut p: Point = serde_json::from_str(r#"{ "x": 3, "y": 5 }"#).unwrap();
println!("deserialized = {:?}", p);
p.x = 4;
let serialized = serde_json::to_string(&p).unwrap();
println!("serialized = {}", serialized);
}
以下 crate 依赖关系对于此示例正常工作是必需的
[dependencies]
serde = "1.0"
serde_derive = "1.0"
serde_json = "1.0"
json_typegen = "0.7"
样本 json 也可以来自本地或远程文件
json_typegen!("Point", "json_samples/point.json");
json_typegen!("Point", "http://example.com/someapi/point.json");
代码生成也可以进行自定义
json_typegen!("Point", "http://example.com/someapi/point.json", {
use_default_for_missing_fields,
"/foo/bar": {
use_type: "map"
}
});
有关配置的详细信息,请参阅 相关文档。
条件编译
为了避免在每次构建时为每个样本执行 HTTP 请求,可以使用条件编译仅在使用时检查远程样本
#[cfg(not(feature = "online-samples"))]
json_typegen!("pub Point", r#"{ "x": 1, "y": 2 }"#);
#[cfg(feature = "online-samples")]
json_typegen!("pub Point", "https://typegen.vestera.as/examples/point.json");
并在 Cargo.toml 中
[features]
online-samples = []
然后您可以通过以下方式验证远程样本是否符合您的期望,例如在 CI 构建中
cargo check --features "online-samples"
命令行界面
json_typegen_cli
crate 提供了一个命令行界面,用于使用与过程宏内部使用的相同代码生成。如果您需要在某些时候自定义生成的代码,而宏参数不切实际,这将提供有用的迁移路径。
有关安装和使用详情,请参阅 其自述文件。
Web 界面
对于简单的测试和一次性使用,还有一个由 WebAssembly 提供支持的 Web 界面,托管在 https://typegen.vestera.as/ 上。源代码在 json_typegen_web
中。
创建自己的类型提供程序 crate
过程宏和形状推理算法实际上都非常简单。要学习/复制算法,您可以查看这个精简版(少于200行)。
许可证
本项目采用双重许可,您可以选择Apache 2.0或MIT许可证。
依赖项
~6–9MB
~175K SLoC