あなたのフィールドにa custom serialization functionを提供するために、serialize_with
attributeを使用することができます。
#[macro_use]
extern crate serde_derive;
extern crate serde;
use serde::Serializer;
fn round_serialize<S>(x: &f32, s: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
s.serialize_f32(x.round())
}
#[derive(Debug, Serialize)]
pub struct NodeLocation {
#[serde(rename = "nodeId")]
id: u32,
#[serde(serialize_with = "round_serialize")]
lat: f32,
#[serde(serialize_with = "round_serialize")]
lon: f32,
}
(私はkにフロートを丸くするための最良の方法は何か」のトピックを避けるために、最も近い整数に丸めました小数位")。
他の半手動アプローチは自動由来のシリアライズと別の構造体を作成し、それを使用してシリアル化を実装することです:
impl Serialize for NodeLocation {
fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
// Implement your preprocessing in `from`.
RoundedNodeLocation::from(loc).serialize(s)
}
}
手動 'Serialize'を実装しますか? – Kroltan