使用旧的 Rust 2015
0.2.0 |
|
---|---|
0.1.0 |
|
#39 在 #samples
100KB
2.5K SLoC
json_typegen - 从 JSON 样本生成 Rust 类型
json_typegen 是一套用于从 JSON 样本生成 Rust 类型的工具,基于 serde 构建。也就是说,你给它一些 JSON,它就会给出必要的类型定义,以便在 Rust 程序中使用该 JSON。如果你熟悉 F#,过程宏 json_typegen!
在 Rust 中作为 JSON 的 类型提供者 工作。它受到了 F# Data 的启发,并使用了相同的推理算法。
该代码生成逻辑有三个接口
过程宏
代码生成工具的第一个接口是过程宏 json_typegen!
。以下示例代码生成了 Point
类型的代码。
#[macro_use]
extern crate json_typegen;
extern crate serde_json;
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);
}
[dependencies]
serde = "1.0"
serde_json = "1.0"
json_typegen = "0.2"
示例 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!("Point", r#"{ "x": 1, "y": 2 }"#);
#[cfg(feature = "online-samples")]
json_typegen!("Point", "http://vestera.as/json_typegen/examples/point.json");
并在 Cargo.toml 中
[features]
online-samples = []
您可以在 CI 构建中按如下方式验证远程样本是否符合您的预期
cargo check --features "online-samples"
命令行界面
json_typegen_cli
crate 提供了一个 CLI,用于与过程宏内部使用的相同代码生成。如果您需要在某个时候对生成的代码进行自定义,而宏参数又不太实用,这将提供一条有用的迁移路径。
有关使用方法的详细信息,请参阅 其 README 文件。
Web 界面
对于简单的测试和一次性使用,还有一个 Web 界面(在 json_typegen_web
中)。目前,此接口的一个实例托管在 http://vestera.as/json_typegen
许可证
该项目采用双重许可,根据您的选择,可以是 Apache 2.0 或 MIT 许可证。
依赖项
~9MB
~194K SLoC