rust - 构建 rust Rocket api 时出现 "no ' Json' in root"错误

标签 rust serde rust-rocket

所以我试图按照 https://medium.com/sean3z/building-a-restful-crud-api-with-rust-1867308352d8 中的示例进行操作构建一个简单的 REST API。中途, rust 编译器给了我以下错误:unresolved imports 'rocket_contrib::Json', 'rocket_contrib::Value' no 'Json' in the root
我似乎无法弄清楚我做错了什么。

这是我的 Cargo.toml:

[package]
name = "rust-api-test"
version = "0.1.0"
authors = ["username"]
edition = "2018"

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

[dependencies]
rocket = "0.4.4"
serde = "1.0"
serde_json = "1.0"
serde_derive = "1.0"

[dependencies.rocket_contrib]
version = "0.4.4"
default-features = false
features = ["json"]

hero.rs:
#[derive(Serialize, Deserialize)]
pub struct Hero {
    pub id: Option<i32>,
    pub name: String,
    pub identity: String,
    pub hometown: String,
    pub age: i32
}

和 main.rs:
#![feature(proc_macro_hygiene, decl_macro)]

#[macro_use] extern crate rocket;
#[macro_use] extern crate rocket_contrib;
#[macro_use] extern crate serde_derive;

mod hero;
use hero::{Hero};

use rocket_contrib::{Json, Value};


#[get("/")]
fn index() -> &'static str {
    "Hello, world!"
}

fn main() {
    rocket::ignite().mount("/", routes![index]).launch();
}

我在第 10 行得到错误:use rocket_contrib::{Json, Value};


我关注了Sven Marnach's advice现在它可以工作了。我将 main.rs 文件更改为以下内容:
#![feature(proc_macro_hygiene, decl_macro)]

#[macro_use] extern crate rocket;
#[macro_use] extern crate rocket_contrib;
#[macro_use] extern crate serde_derive;

mod hero;
use hero::{Hero};

use rocket_contrib::json::{Json, JsonValue};


#[post("/", data = "<hero>")]
fn create(hero: Json<Hero>) -> Json<Hero> {
    hero
}

#[get("/")]
fn read() -> JsonValue {
    json!([
        "hero 1", 
        "hero 2"
    ])
}

#[put("/<id>", data = "<hero>")]
fn update(id: i32, hero: Json<Hero>) -> Json<Hero> {
    hero
}

#[delete("/<id>")]
fn delete(id: i32) -> JsonValue {
    json!({"status": "ok"})
}

#[get("/")]
fn index() -> &'static str {
    "Hello, world!"
}

fn main() {
    rocket::ignite()
        .mount("/", routes![index])
        .mount("/hero", routes![create, update, delete])
        .mount("/heroes", routes![read])
        .launch();
}

最佳答案

示例代码是为现已过时的 Rocket 0.3.x 版本编写的。您不能再基于旧版本启动新项目,因为某些依赖项已从 crates.io 中删除。然而,修复示例代码相对容易——编译器提示的导入无论如何都没有使用,所以你可以简单地删除它。在 rocket_contrib 的 0.4.x 版本中rocket_contrib::Json结构已移至 rocket_contrib::json::Json ,因此您也可以根据需要从新位置导入。 rocket_contrib::Value枚举已替换为 rocket_contrib::json::JsonValue ,尽管有不同的实现,因此您可能需要调整任何用途以适应新接口(interface)。

关于rust - 构建 rust Rocket api 时出现 "no ' Json' in root"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61106971/

相关文章:

http - 如何从 Rust 发出 HTTP 请求?

rust - Handlebars 三个阵列在一个循环中

reactjs - 从 React 应用程序向 Rocket 后端发送 POST 请求时出错返回失败

rust - 如何将在 main 中初始化的变量传递给 Rocket 路由处理程序?

multithreading - 所有权和借用问题,以及跨多个线程共享实例

rust - 我可以在 Rust 中包含模块 "sideways"吗?

rust - 在 Rust 中从 std::env::consts::OS= ="windows"定义一个静态 boolean 值

rust - 如何为Serde编写自定义的named_all属性?

rust - 使用 Serde 反序列化时如何忽略额外的元组项? ("trailing characters"错误)

rust - 如何区分缺少的反序列化字段和空字段?