Serialize a Vec<u8> to JSON as base64

I'm not aware of a crate that does it, but defining a custom module for it is pretty easy.

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize)]
pub struct Status {
	name: String,
	#[serde(with="base64")]
	pub map: Vec<u8>,
}

mod base64 {
    use serde::{Serialize, Deserialize};
    use serde::{Deserializer, Serializer};

    pub fn serialize<S: Serializer>(v: &Vec<u8>, s: S) -> Result<S::Ok, S::Error> {
        let base64 = base64::encode(v);
        String::serialize(&base64, s)
    }
    
    pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<Vec<u8>, D::Error> {
        let base64 = String::deserialize(d)?;
        base64::decode(base64.as_bytes())
            .map_err(|e| serde::de::Error::custom(e))
    }
}
6 Likes