我正在使用serde_json
来解码来自GCP发布/订阅的推送消息.
#[derive(Debug, Deserialize, Serialize)]
pub struct PushMessage {
pub message: Message,
pub subscription: String,
}
在消息中,有效负载是data
键下的Base64编码字符串:
#[derive(Debug, Deserialize, Serialize)]
pub struct Message {
message_id: String,
#[serde(with = "base64data")]
pub data: String,
}
…我用一个简单的base64data
模来解码:
// A serializer/deserializer for base64-encoded data
mod base64data {
use serde::{Deserialize, Serialize};
use serde::{Deserializer, Serializer};
use base64::engine::general_purpose::STANDARD as base64;
use base64::engine::Engine as _;
pub fn serialize<S: Serializer>(v: &str, s: S) -> Result<S::Ok, S::Error> {
let b64 = base64.encode(v);
String::serialize(&b64, s)
}
pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<String, D::Error> {
let b64 = String::deserialize(d)?;
base64
.decode(&b64)
.map(|v| String::from_utf8(v).expect("Invalid UTF-8"))
.map_err(|e| serde::de::Error::custom(e))
}
}
然而,我知道我期望接收的类型也被序列化为JSON(即,Base64编码的字符串解码为JSON字符串),所以理想情况下,我想告诉serde_json
继续处理该字段,而不仅仅是解码Base64数据.这可能吗(例如,通过为我们想要反序列化的类型传递一个泛型参数)?