1

I am trying to Deserialize a string to a struct in rust. The below code is from json_serde documentation only.

use serde::{Deserialize, Serialize};
use serde_json::Result;

#[derive(Serialize, Deserialize)]
struct Person {
    name: String,
    age: u8,
    phones: Vec<String>,
}

fn main() {
    let data = r#"
        {
            "name": "John Doe",
            "age": 43,
            "phones": [
                "+44 1234567",
                "+44 2345678"
            ]
        }"#;

    // Parse the string of data into a Person object. This is exactly the
    // same function as the one that produced serde_json::Value above, but
    // now we are asking it for a Person as output.
    let p: Person = serde_json::from_str(data).expect("bal");

    // Do things just like with any other Rust data structure.
    println!("Please call {} at the number {}", p.name, p.phones[0]);


}

The above code snippet gives me an error:

   Compiling test-json-rs v0.1.0 (/Users/asnimpansari/Desktop/Personal/test-json-rs)
error: cannot find derive macro `Serialize` in this scope
 --> src/main.rs:4:10
  |
4 | #[derive(Serialize, Deserialize)]
  |          ^^^^^^^^^

error: cannot find derive macro `Deserialize` in this scope
 --> src/main.rs:4:21
  |
4 | #[derive(Serialize, Deserialize)]
  |                     ^^^^^^^^^^^

warning: unused imports: `Deserialize`, `Serialize`
 --> src/main.rs:1:13
  |
1 | use serde::{Deserialize, Serialize};
  |             ^^^^^^^^^^^  ^^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

warning: unused import: `serde_json::Result`
 --> src/main.rs:2:5
  |
2 | use serde_json::Result;
  |     ^^^^^^^^^^^^^^^^^^

error[E0277]: the trait bound `Person: serde::de::Deserialize<'_>` is not satisfied
    --> src/main.rs:25:21
     |
25   |     let p: Person = serde_json::from_str(data).expect("bal");
     |                     ^^^^^^^^^^^^^^^^^^^^ the trait `serde::de::Deserialize<'_>` is not implemented for `Person`
     | 
    ::: /Users/asnimpansari/.cargo/registry/src/github.com-1ecc6299db9ec823/serde_json-1.0.55/src/de.rs:2584:8
     |
2584 |     T: de::Deserialize<'a>,
     |        ------------------- required by this bound in `serde_json::de::from_str`

error: aborting due to 3 previous errors

For more information about this error, try `rustc --explain E0277`.
error: could not compile `test-json-rs`.

To learn more, run the command again with --verbose.

My Cargo.toml file has below dependencies

[dependencies]
serde_json = "1.0.55"
serde = "1.0.100"

Despite importing Serialize and Deserialize from the serde and adding to struct. It gives me an error. What part am I doing wrong here?

Asnim P Ansari
  • 1,932
  • 1
  • 18
  • 41

1 Answers1

5

You need to activate the derive macros feature in your Cargo.toml:

serde = { version = "1.0", features = ["derive"] }
vallentin
  • 23,478
  • 6
  • 59
  • 81
Netwave
  • 40,134
  • 6
  • 50
  • 93