如何从 Rust (Rocket) 的 HTTP 端点返回 JSON?

9
什么是在Rust中通过Rocket返回Json的最简单方式?
#[post("/route", data = "<data>")]
fn route(someVariable: String) -> String {
    // How can I return a json response here? {"a": "{someVariable}")
}

我尝试过使用 content::Json(),但它对我来说似乎太静态了。
3个回答

5

如果你觉得content::Json()太过静态,可以使用rocket_contrib包。使用该包可让你传递一个从serde包实现了Deserialize的结构体。

use rocket_contrib::json::Json;
use serde::Deserialize;

#[derive(Deserialize)]
struct User {
  name: String,
  age: u8,
  alive: bool, 
}

#[post("/route", data = "<data>")]
fn route(someVariable: String) -> String {
    let user = User {
        name: "Jon Snow".to_string(),
        age: 21,
        alive: true,
    };
    Json(user_from_id)
}

请确保将依赖项添加到您的 Cargo.toml 文件中。

serde = { version = "1.0", features = ["derive"] }
rocket_contrib = "0.4"

有关 rocket_contrib 的更多信息,请访问 https://api.rocket.rs/v0.4/rocket_contrib/json/struct.Json.html


我如何在不创建结构体进行反序列化的情况下动态响应Json。基本上,如果我不知道我的响应JSON模式是什么,该怎么办。如果我传递一个JSON的字符串表示,而不使用结构体,则它会在响应中返回该字符串,而不是JSON。 - Thinker-101

1
最简单的方法就是使用 serde_json:
serde_json::to_string(&MyStructObject);

serde_json :: to_string将返回一个Result<String>,其中字符串是json字符串。最后在您的Cargo.toml中,您需要拥有以下内容:

serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"


1
在0.5版本中,你不需要`rocket_contrib`,只需要Rocket crate上的`json`功能。
use rocket::serde::{Serialize, json::Json};

#[derive(Serialize)]
#[serde(crate = "rocket::serde")]
struct Task { /* .. */ }

#[get("/todo")]
fn todo() -> Json<Task> {
    Json(Task { /* .. */ })
}

从这里的例子


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