如何将rocket::serde::json::json作为json字符串



我正试图将请求负载中的结构写入kafka,为此,我需要获得表示该结构的JSON字符串。目前,我正在使用一个结构从请求中加载对象,该结构实现了rocket::serde::json中的DeserializeSerialize特性。

代码如下:

#[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字符串表示的内容。

Rocket中的Json类型只是任何可Serialize的内容的包装器,设计用于在其他上下文中使用JSON格式对值进行编码或解码:例如通过FromDataFromUriParamResponder等特性。

但是,不能使用Json来生成JSON字符串。为此,您需要使用rocket::serde::json::to_string,它只是从serdejson机箱中重新导出的。在提示这是的注释中,您需要将内容从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"
}

最新更新