Attribute deserialize_with
Serde deserialize_with
. :
use serde::{de::Error, Deserialize, Deserializer};
use serde_json;
struct EtheriumTransaction {
account: u64,
amount: u64,
}
fn from_hex<'de, D>(deserializer: D) -> Result<u64, D::Error>
where
D: Deserializer<'de>,
{
let s: &str = Deserialize::deserialize(deserializer)?;
u64::from_str_radix(&s[2..], 16).map_err(D::Error::custom)
}
fn main() {
let raw = r
let transaction: EtheriumTransaction =
serde_json::from_str(raw).expect("Couldn't derserialize");
assert_eq!(transaction.amount, 100);
assert_eq!(transaction.account, 0xDEAD_BEEF);
}
, Serde . (let s: &str = Deserialize::deserialize(deserializer)?
). , , Deserialize
, Deserialize
.
serde::Deserialize
, , :
struct EtheriumTransaction {
account: Account, // hex
amount: u64, // decimal
}
struct Account(u64);
impl<'de> Deserialize<'de> for Account {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let s: &str = Deserialize::deserialize(deserializer)?;
// do better hex decoding than this
u64::from_str_radix(&s[2..], 16)
.map(Account)
.map_err(D::Error::custom)
}
}
, "" , .
: