我正在嘗試Serialize在Serde. 這是代碼(操場):
use serde::ser::{Serialize, Serializer, SerializeStruct};
struct Data {
key: String, // or &str
value: i32,
}
impl Serialize for Data {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut state = serializer.serialize_struct("Data", 1)?;
// let key = (&self.key).to_string();
// state.serialize_field(&*key, &self.value)?; //shows lifetime error
state.serialize_field("key", &self.value)?;
state.end()
}
}
fn main() {
let data = Data {
key: String::from("age"),
value: 21,
};
let json = serde_json::to_string_pretty(&data).unwrap();
println!("the JSON is: {}", json)
}
默認情況下,serde序列Data化為:
{
"key": "age",
"value": 21
}
但是,我想要這個:
{
"age": 21,
}
這個問題也很相似,但在這種情況下我需要更多資訊。
uj5u.com熱心網友回復:
您的Data結構本質上是一個單例映射。你應該這樣序列化它:
impl Serialize for Data {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
use serde::ser::SerializeMap;
let mut map = serializer.serialize_map(Some(1))?;
map.serialize_entry(&self.key, &self.value)?;
map.end()
}
}
Playground
關鍵的區別在于它serialize_entry需要一個&Kwhere K: Serialize(即具有任意生命周期的參考),不像serialize_field,它不期望您在運行時提出新的結構欄位并且是為編譯時常量字串構建的,它們是&'static str.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/516514.html
標籤:细绳序列化锈寿命塞尔德
上一篇:在兩個單詞后分組子字串
