【问题标题】:Get Json string from rocket::serde::json::Json从 Rocket::serde::json::Json 获取 Json 字符串
【发布时间】:2022-09-24 12:33:26
【问题描述】:

我正在尝试将请求有效负载中的结构写入 kafka,为此我需要获取表示该结构的 Json 对象的字符串。目前,我正在使用实现来自rocket::serde::json 的反序列化和序列化特征的结构从请求中加载对象。

代码如下所示:

#[macro_use] extern crate rocket;
use rocket::serde::{Serialize, Deserialize};
use rocket::serde::json::Json;

use rdkafka::config::ClientConfig;
use rdkafka::producer::{BaseRecord, FutureProducer};

#[derive(Serialize, Deserialize)]
#[serde(crate = \"rocket::serde\")]
struct Credential {
    metadata: String,
    data: String,
}

#[post(\"/\", data=\"<c>\")]
async fn insert_credentials(c: Json<Credential>) -> &\'static str {

 // Do stuff with c


let producer: &FutureProducer = &ClientConfig::new()
    .set(\"bootstrap.servers\", \"kafka:9200\")
    .set(\"message.timeout.ms\", \"5000\")
    .create()
    .expect(\"Producer creation error\");

let delivery_status = producer
    .send(
        FutureRecord::to(\"credentials_ingestion\")
        .payload(Json(c).to_string())
        .key(\"MyKey\")
    )
    .await;

\"Ok\"

}

但是我无法让 to_string 工作,我在 Rocket 的文档中找不到任何关于如何获取结构的 json 字符串表示的内容。

  • 您对Json(c).to_string() 感到困惑,您可能正在寻找rocket::serde::json::to_string(&amp;c)
  • 是的,这就是我要找的那个,我不知道为什么当我同时导入 Json 和 json 时编译器会引发错误。我将该行更新为.payload(&amp;json::to_string(&amp;c).unwrap()) 但现在我收到另一个错误:`Json<Credential>` @user2722968 没有实现特征Serialize

标签: json rust apache-kafka serde rust-rocket


【解决方案1】:

Rocket 中的 Json 类型只是对任何 Serialize-able 的包装器,旨在在其他上下文中使用 JSON 格式对值进行编码或解码:例如通过 FromDataFromUriParam、@987654327 @等特征。

但是,您不能使用 Json 来创建 JSON 字符串。为此,您需要使用rocket::serde::json::to_string,它只是从 serde-json 板条箱重新导出的。在评论中让你绊倒的是什么您需要从 Json 包装器中取出内容.您可以使用.into_inner() 或使用解构。

这就是你想要的:

use rocket::post;
use rocket::serde::json::{to_string, Json};
use rocket::serde::{Deserialize, Serialize};

use rdkafka::config::ClientConfig;
use rdkafka::producer::{FutureProducer, FutureRecord};
use rdkafka::util::Timeout;

#[derive(Serialize, Deserialize)]
#[serde(crate = "rocket::serde")]
struct Credential {
    metadata: String,
    data: String,
}

#[post("/", data = "<c>")]
async fn insert_credentials(c: Json<Credential>) -> &'static str {
    let credentials = c.into_inner();

    let producer: &FutureProducer = &ClientConfig::new()
        .set("bootstrap.servers", "kafka:9200")
        .set("message.timeout.ms", "5000")
        .create()
        .expect("Producer creation error");

    let delivery_status = producer
        .send(
            FutureRecord::to("credentials_ingestion")
                .payload(&to_string(&credentials).unwrap())
                .key("MyKey"),
            Timeout::Never,
        )
        .await;

    "Ok"
}

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 2016-03-12
    • 2020-11-10
    • 2016-09-30
    相关资源
    最近更新 更多