snippetrustCritical
How do I parse a JSON File?
Viewed 0 times
howfileparsejson
Problem
I have this so far in my goal to Parse this JSON data in Rust:
and
What should be my next step into parsing it? My primary goal is to get JSON data like this, and parse a key from it, like Age.
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();
}and
text.json is{
"FirstName": "John",
"LastName": "Doe",
"Age": 43,
"Address": {
"Street": "Downing Street 10",
"City": "London",
"Country": "Great Britain"
},
"PhoneNumbers": [
"+44 1234567",
"+44 2345678"
]
}What should be my next step into parsing it? My primary goal is to get JSON data like this, and parse a key from it, like Age.
Solution
Serde is the preferred JSON serialization provider. You can read the JSON text from a file a number of ways. Once you have it as a string, use
Cargo.toml:
You could even use something like
Serde can be used for formats other than JSON and it can serialize and deserialize to a custom struct instead of an arbitrary collection:
Check the Serde website for more details.
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"
You could even use something like
serde_json::from_reader to read directly from an opened File.Serde can be used for formats other than JSON and it can serialize and deserialize to a custom struct instead of an arbitrary collection:
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,
}
#[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)
}Check the Serde website for more details.
Code Snippets
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");
}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)
}Context
Stack Overflow Q#30292752, score: 103
Revisions (0)
No revisions yet.