27 个版本 (13 个稳定版)
2.2.4 | 2023年11月28日 |
---|---|
2.2.1 | 2023年10月27日 |
2.0.0 | 2023年7月9日 |
1.2.0 | 2023年5月25日 |
0.1.4 | 2020年12月21日 |
#67 in 编码
18,350 monthly downloads
被 27 个 crate 使用 (14 个直接使用)
51KB
1K SLoC
deser_hjson
这是一个为 Hjson 定制的 Serde 反序列化器,适用于 derive 驱动的反序列化。
Hjson 是一种良好的配置文件语言。这样的文件应该由人类编写,由其他人类读取和修改,然后由程序反序列化为精确的结构。
let file_content = fs::read_to_string(&file_path)?;
let configuration = deser_hjson::from_str(&file_content);
如果配置文件无效或与预期类型不匹配,错误将详细说明预期内容和错误精确位置。
示例
use {
deser_hjson::*,
serde::Deserialize,
std::collections::HashMap,
};
// This Hjson document comes from https://hjson.github.io/
let hjson = r#"
// use #, // or /**/ for comments,
// omit quotes for keys
key: 1
// omit quotes for strings
contains: everything on this line
// omit commas at the end of a line
cool: {
foo: 1
bar: 2
}
// allow trailing commas
list: [
1,
2,
]
// and use multiline strings
realist:
'''
My half empty glass,
I will fill your empty half.
Now you are half full.
'''
"#;
// we'll deserialize it into this struct:
#[derive(Deserialize, PartialEq, Debug)]
struct Example {
key: i32,
contains: Option<String>,
cool: HashMap<String, u16>,
list: Vec<usize>,
realist: String,
missing: Option<f64>,
}
let mut cool = HashMap::new();
cool.insert("foo".to_owned(), 1);
cool.insert("bar".to_owned(), 2);
let expected = Example {
key: 1,
contains: Some("everything on this line".to_owned()),
cool,
list: vec![1, 2],
realist: "My half empty glass,\nI will fill your empty half.\nNow you are half full.".to_owned(),
missing: None,
};
// Here's the deserialization and the equality check:
assert_eq!(expected, from_str(hjson).unwrap());
已知的开源使用案例
常见问题解答
它支持 JSON 吗?
是的,任何 JSON 文件都可以被读取为 Hjson。
为什么只支持基于 derive 的反序列化器?
在具有隐式类型格式的格式中猜测类型是非常危险的。当您的用户输入 false
时,它是字符串还是布尔值?当她输入 3
时,它是字符串还是数字?虽然 Hjson 不像 YAML 那样疯狂,但它没有内部保护措施来处理这种情况,因此应该只将 Hjson 反序列化为显式类型。
为什么只提供反序列化器而不是序列化器?
Hjson 不是一个数据交换格式。它旨在由人类编写,包含大量注释,并具有有意义的格式。虽然在某些情况下序列化器是有意义的,但它们必须是基于模板的,或者提供其他方式来指定注释和格式,而 serde 不是实现这一目标的正确工具。
依赖关系
~0.4–1MB
~23K SLoC