How to do it...

  1. Open the Cargo.toml file that has been generated earlier for you

  2. Under [dependencies], add the following line:
serde_json = "1.0.8"
  1. If you haven't done so already, add the following lines as well:
serde = "1.0.24"
serde_derive
= "1.0.24"
  1. If you want, you can go to the crates.io web pages for serde_json (https://crates.io/crates/serde_json), Serde (https://crates.io/crates/serde), and serde_derive (https://crates.io/crates/serde_derive) to check for the newest versions and use those ones instead
  2. In the bin folder, create a file called json.rs

  3. Add the following code and run it with cargo run --bin json:

1    extern crate serde;
2 extern crate serde_json;
3
4 #[macro_use]
5 extern crate serde_derive;
6
7 use std::io::{BufReader, BufWriter, Read, Seek, SeekFrom,
Write};
8 use std::fs::OpenOptions;
  1. These are the structures we are going to use throughout the recipe:
10   #[derive(Serialize, Deserialize)]
11 struct PetOwner {
12 name: String,
13 age: u8,
14 pets: Vec<Pet>,
15 }
16
17 #[derive(Serialize, Deserialize)]
18 struct Pet {
19 name: String,
20 species: AllowedSpecies,
21 // It is usual for many JSON keys to be optional
22 age: Option<u8>,
23 colour: Option<String>,
24 }
25
26 #[derive(Debug, Serialize, Deserialize)]
27 enum AllowedSpecies {
28 Dog,
29 Turtle,
30 Cat,
31 }
  1. Prepare a new file and call the other functions:
33   fn main() {
34 let file = OpenOptions::new()
35 .read(true)
36 .write(true)
37 .create(true)
38 .open("pet_owner.json")
39 .expect("failed to create JSON file");
40
41 let buf_writer = BufWriter::new(&file);
42 write_json(buf_writer).expect("Failed to write JSON");
43
44 let mut buf_reader = BufReader::new(&file);
45 buf_reader
46 .seek(SeekFrom::Start(0))
47 .expect("Failed to jump to the beginning of the JSON
file");
48 read_json(buf_reader).expect("Failed to read JSON");
49 }
  1. Save our structures as a JSON file:
52   fn write_json<W>(mut writer: W) -> serde_json::Result<()>
53 where
54 W: Write,
55 {
56 let pet_owner = PetOwner {
57 name: "John".to_string(),
58 age: 23,
59 pets: vec![
60 Pet {
61 name: "Waldo".to_string(),
62 species: AllowedSpecies::Dog,
63 age: Some(2),
64 colour: None,
65 },
66 Pet {
67 name: "Speedy".to_string(),
68 species: AllowedSpecies::Turtle,
69 age: Some(47),
70 colour: Some("Green".to_string()),
71 },
72 Pet {
73 name: "Meows".to_string(),
74 species: AllowedSpecies::Cat,
75 age: None,
76 colour: Some("Orange".to_string()),
77 },
78 ],
79 };
80
81 let json = serde_json::to_string(&pet_owner)?;
82 writer
83 .write_all(json.as_bytes())
84 .expect("Failed to write file");
85 Ok(())
86 }
  1. Read the JSON file we just created:
88   fn read_json<R>(mut reader: R) -> serde_json::Result<()>
89 where
90 R: Read,
91 {
92 let mut json = String::new();
93 reader
94 .read_to_string(&mut json)
95 .expect("Failed to read TOML");
96 let pet_owner: PetOwner = serde_json::from_str(&json)?;
97
98 println!("Pet owner profile:");
99 println!(" Name: {}", pet_owner.name);
100 println!(" Age: {}", pet_owner.age);
101
102 println!(" Pets:");
103 for pet in pet_owner.pets {
104 println!(" Name: {}", pet.name);
105 println!(" Species: {:?}", pet.species);
106 if let Some(age) = pet.age {
107 println!(" Age: {}", age);
108 }
109 if let Some(colour) = pet.colour {
110 println!(" Colour: {}", colour);
111 }
112 println!();
113 }
114 Ok(())
115 }
..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
18.220.245.233