未解决的导入`serde`/`serde_json`问题

4
我构建这个项目时没有看到任何显式错误,但在编译时遇到了E0432错误,告诉我serdeserde_json未被发现,尽管它们已经在Cargo.toml中声明。 我尝试了多次从头开始重建项目,使用cargo checkcargo build命令,但是还是卡住了。
错误信息如下:
error[E0432]: unresolved import `serde`
 --> main.rs:1:5
  |
1 | use serde::{Deserialize, Serialize};
  |     ^^^^^ maybe a missing crate `serde`?

error[E0432]: unresolved import `serde_json`
 --> main.rs:2:5
  |
2 | use serde_json::Result;
  |     ^^^^^^^^^^ maybe a missing crate `serde_json`?

error: cannot determine resolution for the derive macro `Serialize`
 --> main.rs:4:10
  |
4 | #[derive(Serialize, Deserialize)]
  |          ^^^^^^^^^
  |
  = note: import resolution is stuck, try simplifying macro imports

error: cannot determine resolution for the derive macro `Deserialize`
 --> main.rs:4:21
  |
4 | #[derive(Serialize, Deserialize)]
  |                     ^^^^^^^^^^^
  |
  = note: import resolution is stuck, try simplifying macro imports

error[E0433]: failed to resolve: use of undeclared crate or module `serde_json`
  --> main.rs:14:32
   |
14 |     let config: ConfigStruct = serde_json::from_str(&config_data).unwrap();
   |                                ^^^^^^^^^^ use of undeclared crate or module `serde_json`

error: aborting due to 5 previous errors

Some errors have detailed explanations: E0432, E0433.
For more information about an error, try `rustc --explain E0432`.

main.rs 文件:

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

#[derive(Serialize, Deserialize)]
struct ConfigStruct {
    playlist_name: String,
    replace_cover: bool,
    delete_songs: bool,
    songs_ids: Vec<String>,
}

fn get_config() -> Result<ConfigStruct> {
    let config_data = std::fs::read_to_string("../config.json").unwrap();
    let config: ConfigStruct = serde_json::from_str(&config_data).unwrap();
    Ok(config)
}

fn main() {
    let config = get_config().unwrap();

    println!("{}", config.playlist_name);
}

Cargo.toml 文件:

[package]
name = "grrs"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
serde = {version = "1.0.144", features = ["derive"] }
serde_json = "1.0.85"

Cargo.lock 文件:

# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3

[[package]]
name = "grrs"
version = "0.1.0"
dependencies = [
 "serde",
 "serde_json",
]

[[package]]
name = "itoa"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754"

[[package]]
name = "proc-macro2"
version = "1.0.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab"
dependencies = [
 "unicode-ident",
]

[[package]]
name = "quote"
version = "1.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
dependencies = [
 "proc-macro2",
]

[[package]]
name = "ryu"
version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"

[[package]]
name = "serde"
version = "1.0.144"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860"
dependencies = [
 "serde_derive",
]

[[package]]
name = "serde_derive"
version = "1.0.144"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00"
dependencies = [
 "proc-macro2",
 "quote",
 "syn",
]

[[package]]
name = "serde_json"
version = "1.0.85"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44"
dependencies = [
 "itoa",
 "ryu",
 "serde",
]

[[package]]
name = "syn"
version = "1.0.99"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13"
dependencies = [
 "proc-macro2",
 "quote",
 "unicode-ident",
]

[[package]]
name = "unicode-ident"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcc811dc4066ac62f84f11307873c4850cb653bfa9b1719cee2bd2204a4bc5dd"

rustc的版本是1.63.0,我正在使用Windows 10。 - La-lo-go
你可以尝试删除整个“target”子目录并重新构建。 - rodrigo
我认为这是需要你整个项目的情况之一。通常我会不鼓励这样做,但你介意先删除“target”文件夹,然后将整个crate文件夹打包成zip/rar文件并发布链接吗?还要提供您用于构建的确切命令?我相信您的工作流程中可能有一些细节出错,需要整个项目才能复现。到目前为止,你发布的所有内容都是正确的。 - Finomnis
2
你写道:“我构建项目时没有看到任何错误,但是在编译时...”这里的“编译”与“构建”有什么具体区别?(如果你指的是运行rustc main.rs - 那就是问题所在。) - Kevin Reid
如果您对二进制文件的位置感到困惑,可以运行 cargo buildcargo build --release,然后您的可执行二进制文件将位于 target/debugtarget/release。请注意,cargo build/cargo run 内部使用 rustc 进行构建,您永远不必手动执行 rustc - Finomnis
显示剩余9条评论
1个回答

2

您需要从serde创建启用derive功能。

您的cargo.toml文件应该像这样:

[package]
name = "grrs"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
serde = { version = "1.0.144", features = ["derive"] }
serde_json = "1.0.85"
rspotify = "0.11.5"

请注意在serde依赖声明中的feature关键字。


是的,我已经做了那个,但还是一样。我已经更新了问题。 - La-lo-go
明确指定功能总是一个好主意,但事实上,这个项目没有必要这样做,因为rspotify已经需要该功能 - rodrigo
@rodrigo同意,我认为如果一个crate删除了其依赖项的某个feature,这并不被视为破坏性更改。 - Finomnis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接