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

Download history 33/week @ 2024-04-08 8/week @ 2024-04-15 23/week @ 2024-04-22 7/week @ 2024-04-29 8/week @ 2024-05-06 13/week @ 2024-05-13 14/week @ 2024-05-20 3/week @ 2024-05-27 27/week @ 2024-06-03 58/week @ 2024-06-10 26/week @ 2024-06-17 23/week @ 2024-06-24 50/week @ 2024-07-01 199/week @ 2024-07-08 215/week @ 2024-07-15 166/week @ 2024-07-22

每月下载量 633
4 crate 中使用

BSD-2-Clause 协议

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}}}}}}}}}

基准测试结果

nested json objects comparison

使用 Rust 宏编码一个非常简单的 JSON 对象

编码后的对象

{
        "void": null,
        "list": [1, 2, 3, 3],
        "hello": "world"
}

基准测试结果

simple object

使用 #[derive(...)] 编码一个非常简单的 JSON 对象

编码后的对象

{
        "void": null,
        "list": [1, 2, 3, 3],
        "hello": "world"
}

由以下Rust结构体创建

#[derive(Serialize, JSONValue)]
struct MyObject {
    void: (),
    list: Vec<f64>,
    hello: String,
}

基准测试结果

simple object

依赖项

~155KB