到目前为止,我的目标是在Rust中解析此JSON数据:
extern crate rustc_serialize; use rustc_serialize::json::Json; use std::fs::File; use std::io::copy; use std::io::stdout; fn main() { let mut file = File::open("text.json").unwrap(); let mut stdout = stdout(); let mut str = ©(&mut file, &mut stdout).unwrap().to_string(); let data = Json::from_str(str).unwrap(); }
并且text.json是
text.json
{ "FirstName": "John", "LastName": "Doe", "Age": 43, "Address": { "Street": "Downing Street 10", "City": "London", "Country": "Great Britain" }, "PhoneNumbers": [ "+44 1234567", "+44 2345678" ] }
我下一步应该解析什么?我的主要目标是获取这样的JSON数据,并从其中解析密钥(例如Age)。
Serde是首选的JSON序列化提供程序。您可以通过多种方式从文件中读取JSON文本。将其作为字符串使用后,请使用serde_json::from_str:
serde_json::from_str
fn main() { let the_file = r#"{ "FirstName": "John", "LastName": "Doe", "Age": 43, "Address": { "Street": "Downing Street 10", "City": "London", "Country": "Great Britain" }, "PhoneNumbers": [ "+44 1234567", "+44 2345678" ] }"#; let json: serde_json::Value = serde_json::from_str(the_file).expect("JSON was not well-formatted"); }
Cargo.toml:
[dependencies] serde = { version = "1.0.104", features = ["derive"] } serde_json = "1.0.48"
您甚至可以使用类似的serde_json::from_reader方法直接从已打开的读取File。
serde_json::from_reader
File
Serde可以用于JSON以外的其他格式,并且可以序列化和反序列化为自定义结构,而不是任意集合:
use serde::Deserialize; #[derive(Debug, Deserialize)] #[serde(rename_all = "PascalCase")] struct Person { first_name: String, last_name: String, age: u8, address: Address, phone_numbers: Vec<String>, } #[derive(Debug, Deserialize)] #[serde(rename_all = "PascalCase")] struct Address { street: String, city: String, country: String, } fn main() { let the_file = /* ... */; let person: Person = serde_json::from_str(the_file).expect("JSON was not well-formatted"); println!("{:?}", person) }
有关更多详细信息,请访问Serde网站。