16 个版本 (5 个稳定版)
1.1.1 | 2019 年 4 月 4 日 |
---|---|
1.1.0 | 2019 年 4 月 3 日 |
1.0.0 | 2018 年 10 月 23 日 |
0.1.10 | 2018 年 10 月 23 日 |
在 编码 中排名 1548
每月下载量 633
在 4 crate 中使用
41KB
750 行
json_in_type
在 Rust 中快速 JSON 编码器,编译时做更多工作,运行时做更少的工作。一个显著的特性是能够将 JSON 对象的结构编码到其类型中。
这允许在内存中对对象进行非常紧凑的表示,并且比传统方法(例如,serde 的 json!
宏)快一个数量级,传统方法将 JSON 对象存储在映射中。
这个库的目标是尽可能接近你通过在源代码中手动编写 JSON 并使用字符串格式化插入动态值所获得的性能和内存占用。
fn write_obj_bad(value: f32) -> String {
format!("{{\"value\":{}}}", value)
}
// Safer, but equivalent and not less efficient :
fn write_obj_good(value: f32) -> String {
( json_object! { value } ).to_json_string()
}
示例用法
use json_in_type::*;
fn main() {
let void = ();
let list = json_list![42u8, true];
let dynamic_key = "hello";
let json_val = json_object!{
void, list,
[dynamic_key]: "world"
};
/* The type of json_val is:
InlinedJSONObjectEntry<
(),
InlinedJSONObjectEntry<
JSONListElem<u8,
JSONListElem<JSONtrue,
JSONListEnd>>>,
JSONObjectEntry<
&str, &str,
JSONObjectEnd>>>
*/
assert_eq!(
r#"{"void":null,"list":[42,true],"hello":"world"}"#,
json_val.to_json_string()
);
}
内存使用
生成的类型在运行时具有非常小的内存占用。你只需为放入其中的内容付费,而不是为 JSON 结构付费!
在下一个示例中,我们仅使用两个字节来存储以下 JSON 结构
{
"result_count" : 1,
"errors" : null,
"results" : [
{"answer":42, "ok":true}
]
}
fn test_memory_size() {
let (result_count, answer) = (1u8, 42u8);
let my_val = json_object! {
result_count,
errors: null,
results: json_list![
json_object!{answer, ok: true}
]
};
// my_val weighs only two bytes, because we stored only 2 u8 in it
assert_eq!(2, ::std::mem::size_of_val(&my_val));
}
性能
这个库通常比 SERDE 快。以下是在 AMD Ryzen 5 1600X 上实现的不同的 JSON 序列化任务的详细比较结果。查看详细的基准测试结果。
使用 Rust 宏编码 8 个嵌套 JSON 对象
我们使用 serde 的 json!
和 json_in_type 的 json_object!
宏来编码嵌套 JSON 对象。
编码后的对象
我们编码了一个由 8 个嵌套对象组成的 JSON 结构,每个对象都包含一个在编译时已知的键。最后一个嵌套对象包含一个在编译时未知的整数 n。
{"nested":{"nested":{"nested":{"nested":{"nested":{"nested":{"nested":{"nested":{"value":n}}}}}}}}}
基准测试结果
使用 Rust 宏编码一个非常简单的 JSON 对象
编码后的对象
{
"void": null,
"list": [1, 2, 3, 3],
"hello": "world"
}
基准测试结果
使用 #[derive(...)]
编码一个非常简单的 JSON 对象
编码后的对象
{
"void": null,
"list": [1, 2, 3, 3],
"hello": "world"
}
由以下Rust结构体创建
#[derive(Serialize, JSONValue)]
struct MyObject {
void: (),
list: Vec<f64>,
hello: String,
}
基准测试结果
外部链接
- docs.rs托管了这个crate的API文档。
- 您可以使用json_in_type_derive crate自动为您的类型派生
JSONValue
特质 - 您可以在crates.io上的json_in_type查看
依赖项
~155KB