How do I parse a JSON File?

后端 未结 4 1556
梦如初夏
梦如初夏 2020-12-13 12:28

I have this so far in my goal to Parse this JSON data in Rust:

extern crate rustc_serialize;
use rustc_serialize::json::Json;
use std::fs::File;
use std::io:         


        
相关标签:
4条回答
  • 2020-12-13 12:56

    Upvoted the accepted answer (as it helps), but just adding my answer, using the widely used serde_json crate referenced by @FrickeFresh

    Assuming your foo.json is

    {
        "name": "Jane",
        "age": 11
    }
    

    Implementation would look something like

    extern crate serde;
    extern crate json_serde;
    #[macro_use] extern crate json_derive;
    use std::fs::File;
    use std::io::Read;
    
    #[derive(Serialize, Deserialize)]
    struct Foo {
        name: String,
        age: u32,
    }
    
    fn main() {
       let mut file = File::open("foo.json").unwrap();
       let mut buff = String::new();
       file.read_to_string(&mut buff).unwrap();
    
       let foo: Foo = serde_json::from_str(&buff).unwrap();
       println!("Name: {}", foo.name);
    }
    
    0 讨论(0)
  • 2020-12-13 12:57

    There is a brief and complete example of how to read JSON from file in serde_json::de::from_reader docs.

    Here is a short snippet for:

    • reading a file
    • parsing its contents as a JSON
    • and extracting a field with the desired key

    Enjoy:

    let file = fs::File::open("text.json")
        .expect("file should open read only");
    let json: serde_json::Value = serde_json::from_reader(file)
        .expect("file should be proper JSON");
    let first_name = json.get("FirstName")
        .expect("file should have FirstName key");
    
    0 讨论(0)
  • 2020-12-13 13:10

    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 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<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)
    }
    

    Check the Serde website for more details.

    0 讨论(0)
  • 2020-12-13 13:14

    Solved by the many helpful members of the Rust community:

    extern crate rustc_serialize;
    use rustc_serialize::json::Json;
    use std::fs::File;
    use std::io::Read;
    
    fn main() {
        let mut file = File::open("text.json").unwrap();
        let mut data = String::new();
        file.read_to_string(&mut data).unwrap();
    
        let json = Json::from_str(&data).unwrap();
        println!("{}", json.find_path(&["Address", "Street"]).unwrap());
    }
    
    0 讨论(0)
提交回复
热议问题