1 个不稳定版本
0.1.0 | 2023年2月2日 |
---|
#992 in 编码
15,370 每月下载量
在 6 crates 中使用
72KB
2K SLoC
JSON5
一个用于使用 Serde 序列化和反序列化 JSON5 的 Rust 库。
本项目是 callum-oakley/json5-rs 的分支。
lib.rs
:
JSON5 是一个扩展了 JSON 语法的超集,包括一些来自 ECMAScript 5.1 的产生式。
特别是,JSON5 允许注释、尾随逗号、不带引号的键、单引号字符串等。有关详细信息,请参阅 JSON5 项目页面。
{
// comments
unquoted: 'and you can quote me on that',
singleQuotes: 'I can use "double quotes" here',
lineBreaks: "Look, Mom! \
No \\n's!",
hexadecimal: 0xdecaf,
leadingDecimalPoint: .8675309, andTrailing: 8675309.,
positiveSign: +1,
trailingComma: 'in objects', andIn: ['arrays',],
"backwardsCompatible": "with JSON",
}
此 crate 提供了将 JSON5 文本反序列化为 Rust 数据类型的函数,以及将 Rust 数据类型序列化为 JSON5 文本的函数,两者都通过 Serde 框架 实现。
反序列化
在您的类型上实现 Serde 的 Deserialize
特性将允许您使用 from_str
将 JSON5 文本解析为该类型的值。
use serde_derive::Deserialize;
#[derive(Deserialize, Debug, PartialEq)]
struct Config {
message: String,
n: i32,
}
let config = "
{
// A traditional message.
message: 'hello world',
// A number for some reason.
n: 42,
}
";
assert_eq!(
serde_json5::from_str(config),
Ok(Config {
message: "hello world".to_string(),
n: 42,
}),
);
有许多方式可以自定义反序列化(例如,将 camelCase
字段名反序列化为具有 snake_case
字段的结构体)。请参阅 Serde 文档,特别是 属性、自定义序列化 和 示例 部分。
序列化
同样,在Rust类型上实现 Serialize
允许您使用 to_string
生成该类型的JSON5序列化。目前序列化器只会生成JSON(因为它是JSON5的有效子集),但未来的工作将允许指定输出样式(单引号或双引号,尾随逗号,缩进等)。
use serde_derive::Serialize;
#[derive(Serialize, PartialEq, Debug)]
#[serde(untagged)]
enum Val {
Number(f64),
Bool(bool),
String(String),
}
assert_eq!(
serde_json5::to_string(&vec![
Val::Number(42.),
Val::Bool(true),
Val::String("hello".to_owned()),
]),
Ok("[42,true,\"hello\"]".to_owned()),
)
有许多方式可以自定义序列化(例如,将 snake_case
结构体字段序列化为 camelCase
)。请参阅Serde文档,特别是属性、自定义序列化和示例部分。
局限性
在撰写本文时,以下内容不受支持
-
将数据反序列化为借用类型(例如,类型为
&str
的字段) -
序列化或反序列化 字节数组
-
指定序列化器的JSON5输出样式(单引号或双引号,尾随逗号,缩进等)
依赖项
~2.3–3MB
~63K SLoC