将 Claims 字段反序列化为字符串 returns 个额外字符
Deserializing a Claims field to string returns additional characters
我需要反序列化以下有效负载,特别是 JSON 对象中的 aud
字段:
claims: Claims {
aud: One("CBr3zBlrKBbwmxOAM1avZQ=="), // 24 len
// ...
}
claims::aud
是一个 Aud
枚举:
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum Aud {
One(String),
Many(Vec<String>),
}
当我尝试从 serde_json::to_string()
获取 String
时,它 return 有两个额外的字符,一个开始字符和一个结束字符。
use serde_json::Result;
fn aud_from_json(data: &claims::Aud) -> Result<String> {
let v = serde_json::to_string(&data)?;
Ok(v.to_owned())
}
let aud = aud_from_json(&token_data.claims.aud)?;
log::debug!("aud field: {:?}\t aud field len({})", &aud, &aud.len());
$ aud field: "\"CBr3zBlrKBbwmxOAM1avZQ==\"" aud field len(26)
似乎有序列化到字符串中的尾随转义字符。
有没有一种方法可以将 return aud
字段 return 编辑为 String
,并且在没有额外字符的情况下进行清理?
例如"CBr3zBlrKBbwmxOAM1avZQ=="
问题是 serde_json::to_string()
被误认为是实际的 to_string()
实现,而不是 JSON 字符串。
提取枚举变体的内部成员最好通过模式匹配来完成。由于OP的要求,Vec
的最后一个aud
成员是最重要的
最终实施(playground):
use std::io::Result;
use serde;
#[macro_use] extern crate serde_derive;
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum Aud {
One(String),
Many(Vec<String>),
}
fn aud_from_json(data: &Aud) -> Result<String> {
match data {
Aud::One(audience) => Ok(audience.clone()),
Aud::Many(audiences) => audiences
.last()
.ok_or(std::io::Error::new(std::io::ErrorKind::NotFound, "No audience found"))
.map(|r| r.clone())
}
}
如果我正确理解了你在回复@SébastienRenauld 的回答时所说的话,你想对 Aud
实例中包含的字符串进行 base-64 解码。这可以通过以下方式实现:
let aud = Aud::One("CBr3zBlrKBbwmxOAM1avZQ==".to_string());
if let Aud::One(code) = aud {
let decoded = base64::decode(&code).unwrap();
log::debug!("Decoded: {:?}", decoded);
}
我需要反序列化以下有效负载,特别是 JSON 对象中的 aud
字段:
claims: Claims {
aud: One("CBr3zBlrKBbwmxOAM1avZQ=="), // 24 len
// ...
}
claims::aud
是一个 Aud
枚举:
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum Aud {
One(String),
Many(Vec<String>),
}
当我尝试从 serde_json::to_string()
获取 String
时,它 return 有两个额外的字符,一个开始字符和一个结束字符。
use serde_json::Result;
fn aud_from_json(data: &claims::Aud) -> Result<String> {
let v = serde_json::to_string(&data)?;
Ok(v.to_owned())
}
let aud = aud_from_json(&token_data.claims.aud)?;
log::debug!("aud field: {:?}\t aud field len({})", &aud, &aud.len());
$ aud field: "\"CBr3zBlrKBbwmxOAM1avZQ==\"" aud field len(26)
似乎有序列化到字符串中的尾随转义字符。
有没有一种方法可以将 return aud
字段 return 编辑为 String
,并且在没有额外字符的情况下进行清理?
例如"CBr3zBlrKBbwmxOAM1avZQ=="
问题是 serde_json::to_string()
被误认为是实际的 to_string()
实现,而不是 JSON 字符串。
提取枚举变体的内部成员最好通过模式匹配来完成。由于OP的要求,Vec
的最后一个aud
成员是最重要的
最终实施(playground):
use std::io::Result;
use serde;
#[macro_use] extern crate serde_derive;
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[serde(untagged)]
pub enum Aud {
One(String),
Many(Vec<String>),
}
fn aud_from_json(data: &Aud) -> Result<String> {
match data {
Aud::One(audience) => Ok(audience.clone()),
Aud::Many(audiences) => audiences
.last()
.ok_or(std::io::Error::new(std::io::ErrorKind::NotFound, "No audience found"))
.map(|r| r.clone())
}
}
如果我正确理解了你在回复@SébastienRenauld 的回答时所说的话,你想对 Aud
实例中包含的字符串进行 base-64 解码。这可以通过以下方式实现:
let aud = Aud::One("CBr3zBlrKBbwmxOAM1avZQ==".to_string());
if let Aud::One(code) = aud {
let decoded = base64::decode(&code).unwrap();
log::debug!("Decoded: {:?}", decoded);
}