5 个版本
0.1.3 | 2020年9月27日 |
---|---|
0.1.2 | 2020年9月25日 |
0.1.1 | 2020年6月15日 |
0.1.0 | 2020年6月13日 |
0.0.0 | 2020年6月5日 |
#1130 in 编码
每月 31 次下载
在 3 crates 中使用
59KB
1K SLoC
json_minimal
符合 https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf 的最小化 json 包。
教程(创建 json)
为了创建一个有效的(即普遍接受的)json,您应该始终从以下内容开始
use json_minimal::*;
let mut json = Json::new();
// which is equivalent to
let mut json = Json::JSON(Vec::new());
// ...
要添加一个对象,只需这样做
// ...
let greeting =
Json::OBJECT {
name: String::from("Greeting"),
value: Box::new(
Json::STRING( String::from("Hello, world!") )
)
}
;
json.add(greeting);
// ...
或者也可以这样做
// ...
json.add(
Json::OBJECT {
name: String::from("Greeting"),
value: Box::new(
Json::STRING( String::from("Hello, world!") )
)
}
);
// ...
如您所见,虽然这个库很小(在我看来),但它可能不是使用起来最快的。当向对象中添加数组时这一点变得更加明显。
// ...
let mut days_in_the_week =
Json::OBJECT {
name: String::from("Days of the week"),
value: Box::new(
Json::JSON(Vec::new())
)
}
;
let mut days = Json::ARRAY(Vec::new());
days
.add(
Json::STRING( String::from("Monday") )
)
.add(
Json::STRING( String::from("Tuesday") )
)
.add(
Json::STRING( String::from("Wednesday") )
)
.add(
Json::STRING( String::from("Thursday") )
)
.add(
Json::STRING( String::from("Friday") )
)
.add(
Json::STRING( String::from("Saturday") )
)
.add(
Json::STRING( String::from("Sunday") )
)
;
days_in_the_week
.add(
Json::OBJECT {
name: String::from("Total number of days"),
value: Box::new(
Json::NUMBER(7.0) // Accepts `f64`
)
}
)
.add(
Json::OBJECT {
name: String::from("They are called"),
value: Box::new(
days
)
}
)
;
json.add(days_in_the_week);
// ...
总之
// ...
let mut conclusion =
Json::OBJECT {
name: String::from("Conclusion"),
value: Box::new(
Json::JSON(Vec::new())
)
}
;
conclusion
.add(
Json::OBJECT {
name: String::from("Minimal in my opinion"),
value: Box::new(
Json::BOOL(true)
)
}
)
.add(
Json::OBJECT {
name: String::from("How much I care about your opinion"),
value: Box::new(
Json::NULL
)
}
)
.add(
Json::OBJECT {
name: String::from("Comment"),
value: Box::new(
Json::STRING( String::from(";)") )
)
}
)
;
json.add(conclusion);
// ...
调用
// ...
let resulting_json = json.print();
这将导致一个包含以下内容的 String
: {"Greeting":"Hello, world!","Days of the week":{"Total number of days":7,"They are called":["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]},"Conclusion":{"Minimal in my opinion":true,"How much I care about your opinion":null,"Comment":";)"}}
如果您希望以不同的格式获取json字符串,您可以轻松地创建自己的“print”函数。
教程(解析和操作json)
从字节中解析json值甚至更加简洁——但代价是更繁琐。让我们看看我们如何解析上面生成的json
use json_minimal::*;
let json = match Json::parse(b"{\"Greeting\":\"Hello, world!\",\"Days of the week\":{\"Total number of days\":7,\"They are called\":[\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\",\"Sunday\"]},\"Conclusion\":{\"Minimal in my opinion\":true,\"How much I care about your opinion\":null,\"Comment\":\";)\"}}") {
Ok(json) => {
json
},
Err( (position,message) ) => {
panic!("`{}` at position `{}`!!!");
}
}
// ...
首先,让我们谈谈解析错误提供的信息。正如您可能预期的,这是最简单的。上面的 position
是出错的起始位置,而 message
将类似于 "Error parsing array."
,如果例如缺少某个地方的闭合 ]
。继续我们之前的地方
// ...
match json.get("Greeting") {
Some(json) => {
match json {
Json::OBJECT { name: _, value } => {
match value.unbox() {
Json::STRING(val) => {
assert_eq!("Hello, world!",val);
},
json => {
panic!("Expected Json::STRING but found {:?}",json);
}
}
},
json => {
panic!("Expected Json::JSON but found {:?}!!!",json)
}
}
},
None => {
panic!("Couln't find Greeting. How rude!");
}
}
// ...
遗憾的是,这一切都是必要的,因为尽管我们确认了 "Greeting"
存在,但我们无法知道它到底是什么。这还没有结束
// ...
match json.get("Days of the week") { // Hint: You can also use `get_mut` to aid in editing/creating jsons...
Some(json) => {
match json {
Json::OBJECT { name: _, value } => {
match value.unbox() {
Json::JSON(values) => {
assert_eq!(values.len(),2);
match &values[0] {
Json::OBJECT { name, value: _ } => {
assert_eq!("Total number of days",name);
},
json => {
panic!("Expected Json::OBJECT but found {:?}!!!",json);
}
}
match &values[1] {
Json::OBJECT { name, value: _ } => {
assert_eq!("They are called",name);
},
json => {
panic!("Expected Json::OBJECT but found {:?}!!!",json);
}
}
},
json => {
panic!("Expected Json::JSON but found {:?}!!!",json);
}
}
},
json => {
panic!("Expected Json::OBJECT but found {:?}!!!",json);
}
}
},
None => {
panic!("Days of the week not found!");
}
}
// You get the idea.
Json::parse(...)
函数还可以解析“独立值”。例如
match Json::parse("\"What's up?\"") {
Ok(json) => {
match json {
Json::STRING(val) => {
assert_eq!("What's up?",val);
},
json => {
panic!("Expected Json::STRING but found {:?}!!!",json);
}
}
},
Err( (position,message) ) => {
panic!("`{}` at position `{}`.");
}
}
// Another example:
match Json::parse("[1,2,3,\"four\"]") {
Ok(json) => {
match json {
Json::ARRAY(val) => {
assert_eq!(val.len(),4);
},
json => {
panic!("Expected Json::ARRAY but found {:?}!!!",json);
}
}
},
Err( (position,message) ) => {
panic!("`{}` at position `{}`.");
}
}
更改和改进
-
Lonami(github)进行了改进
json_minimal
现在可以解析非ASCII字符串和转义序列。(我承认我忽略了这一点。)- 代码通过使用问号操作符和 rustfmt 而更加整洁。
- 一些以前不工作的解析功能现在可以工作了。
非常感谢 Lonami!!!
-
json_minimal
现在也可以解析类似这样的 'pretty' JSON (只要格式化时只使用了\r
、\n
、\t
和空白字符)
{
"Array": [ "Hello" , "World" , "!" ]
}
这本来也应该从一开始就能工作,但我没有包括,因为我反感能源效率低下(尽管这可能是不必要的)。
如果有什么地方不工作,请告诉我。虽然我不能保证我会立即反应。