52个版本
0.12.4 | 2020年3月18日 |
---|---|
0.12.1 | 2020年1月14日 |
0.12.0 | 2019年9月6日 |
0.11.14 | 2019年6月4日 |
0.10.0 | 2016年7月22日 |
#2843 in 解析实现
327,613 每月下载量
用于 689 个crate(490直接使用)
145KB
3K SLoC
json-rust
轻松解析和序列化JSON。
为什么?
JSON是一个非常松散的格式,几乎可以容纳任何内容——数组可以包含混合类型,对象键可以在API调用之间更改类型或在某些条件下不包含某些键。将这种映射应用到习惯性的Rust结构体中会引入摩擦。
这个crate旨在避免这种摩擦。
let parsed = json::parse(r#"
{
"code": 200,
"success": true,
"payload": {
"features": [
"awesome",
"easyAPI",
"lowLearningCurve"
]
}
}
"#).unwrap();
let instantiated = object!{
// quotes on keys are optional
"code": 200,
success: true,
payload: {
features: [
"awesome",
"easyAPI",
"lowLearningCurve"
]
}
};
assert_eq!(parsed, instantiated);
一等公民
使用宏和索引,可以轻松处理数据。
let mut data = object!{
foo: false,
bar: null,
answer: 42,
list: [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;
性能和一致性
这里曾经有一段话说明性能不是这个crate的主要目标。现在它绝对是一个。
虽然这个crate不提供将JSON解析到原生Rust结构体的方法,但它对DOM解析、字符串化和操作的性能进行了大量优化。它在基准测试中表现良好,在某些情况下甚至可以超过解析到结构体的性能。
这个crate根据 RFC 7159和ECMA-404文档实现标准。为了最佳互操作性,浮点数的数字被存储为64位精度尾数和16位指数。
许可证
此crate在MIT许可证和Apache许可证(版本2.0)的条款下分发。选择最适合您的一个。
有关详细信息,请参阅LICENSE-APACHE和LICENSE-MIT。