#json #configure #json-parser #human #line #string #conf

conf_json

JSON解析器中的人可编辑配置文件

3个版本

0.1.4 2023年11月10日
0.1.3 2023年11月9日
0.1.2 2023年11月8日

#1356编码

MIT/Apache

26KB
645

一个支持JSON的配置文件解析器

这个crate主要为了从人可编辑的JSON配置文件中进行读取,而不是写入。大多数配置键访问方法都是不可变的。

除了标准JSON,还支持以下特性

  • 注释以'#'开头,可以占整行或行的后部分
  • 允许使用单引号和双引号字符串
  • 对于JSON数组和对象,允许使用尾随逗号

示例

str解析

use conf_json::value;
let s = r##"
	# this is a json conf file
	#
	{
		# comment line
		"null_key": null,
		"i64_key": 1,
		"i64_sci_key": 123E+4,
		"i64_0x_key": 0xAf,
		"f64_key": 3.14,
		"f64_sci_key": 3.14e-2,
		"true_key": true,
		"false_key": false,  # comment in line
		'single_quote_key': 'a single quote value',
		"object_key": {
			"inner_key1": "abc",
			"inner_key2": 3.14E3,
		},
		"array_key": [1, "abc", ],
	}
"##;
println!("data source:");
println!("{}", s);
let v = s.parse::<value::Value>().unwrap();

// basic accessing
println!("\nbasic accessing assertion begin ...");
assert!(v.is_object());
assert!(!v.is_null());
assert!(v.has("i64_key"));
assert!(!v["null_key"].as_bool());
assert!(v["i64_key"].as_bool());
assert_eq!(v["i64_key"].as_i64(), 1);
assert_eq!(v["f64_key"].as_f64(), 3.14);
assert_eq!(v["object_key"]["inner_key1"].as_str(), "abc");
assert_eq!(v["array_key"][1].as_str(), "abc");
println!("basic accessing assertion pass");

// iter over JSON Array
println!("\niter over JSON Array:");
v["array_key"].iter_array().for_each(|v| {println!("{:?}", v); });

// iter over JSON Object
println!("\niter over JSON Object:");
v.iter_object().for_each(|(k, v)| { println!("{}: {:?}", k, v); });

str加载

use conf_json;
let v: conf_json::value::Value = "\"abc\"".as_bytes().into();
assert_eq!(v.as_str(), "abc");

从文件加载

use conf_json;
let v = conf_json::load_from_file("sample.conf").unwrap();
assert!(v.is_object());
assert_eq!(v["f64_key"].as_f64(), 3.14);

从任何实现std::io::Read特质的类型T t加载

use conf_json;
let t = b"123";
let v: conf_json::value::Value = t.as_slice().into();
assert_eq!(v.as_i64(), 123);

In Cargo.toml

[dependencies]
conf_json = "0.1.4"

无运行时依赖