1 个不稳定版本

0.12.1 2020年2月21日

#1341 in 解析器实现

MIT/Apache

140KB
3K SLoC

json-rust

Travis shield Crates.io version shield Crates.io license shield

轻松解析和序列化 JSON。

变更日志 - 完整文档 - Cargo - 仓库

为什么?

JSON 是一个非常宽松的格式,几乎可以包含任何内容——数组可以包含混合类型,对象键可以在 API 调用之间改变类型或者在某些条件下不包含某些键。将这种映射到惯用的 Rust 结构体引入了摩擦。

此软件包旨在避免这种摩擦。

let parsed = json::parse(r#"

{
    "code": 200,
    "success": true,
    "payload": {
        "features": [
            "awesome",
            "easyAPI",
            "lowLearningCurve"
        ]
    }
}

"#).unwrap();

let instantiated = object!{
    "code" => 200,
    "success" => true,
    "payload" => object!{
        "features" => array![
            "awesome",
            "easyAPI",
            "lowLearningCurve"
        ]
    }
};

assert_eq!(parsed, instantiated);

一等公民

使用宏和索引,可以轻松处理数据。

let mut data = object!{
    "foo" => false,
    "bar" => json::Null,
    "answer" => 42,
    "list" => array![json::Null, "world", true]
};

// Partial equality is implemented for most raw types:
assert!(data["foo"] == false);

// And it's type aware, `null` and `false` are different values:
assert!(data["bar"] != false);

// But you can use any Rust number types:
assert!(data["answer"] == 42);
assert!(data["answer"] == 42.0);
assert!(data["answer"] == 42isize);

// Access nested structures, arrays and objects:
assert!(data["list"][0].is_null());
assert!(data["list"][1] == "world");
assert!(data["list"][2] == true);

// Error resilient - accessing properties that don't exist yield null:
assert!(data["this"]["does"]["not"]["exist"].is_null());

// Mutate by assigning:
data["list"][0] = "Hello".into();

// Use the `dump` method to serialize the data:
assert_eq!(data.dump(), r#"{"foo":false,"bar":null,"answer":42,"list":["Hello","world",true]}"#);

// Or pretty print it out:
println!("{:#}", data);

安装

只需将其添加到您的 Cargo.toml 文件

[dependencies]
json = "*"

然后将其导入到您的 main.rs / lib.rs 文件中

#[macro_use]
extern crate json;

性能和一致性

这里曾经有一句话说明性能不是此软件包的主要目标。现在它肯定是一个目标。

虽然此软件包不提供将 JSON 解析到原生 Rust 结构体的方式,但它对 DOM 解析、字符串化和操作的性能进行了大量优化。它在 基准测试中表现良好,在某些情况下甚至可以超过解析到结构体的性能。

此软件包根据 RFC 7159ECMA-404 文档实现标准。为了实现最佳互操作性,浮点数以 64 位精度尾数和 16 位指数表示。

许可证

此软件包根据 MIT 许可证和 Apache 许可证(版本 2.0)分发。选择最适合您的许可证。

有关详细信息,请参阅 LICENSE-APACHELICENSE-MIT

无运行时依赖项