0

我需要反序列化以下有效负载,特别是aud来自 JSON 对象的字段:

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>),
}

当我尝试从中获取 aString时,serde_json::to_string()它会返回两个额外的字符,一个开始字符和结束字符。

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)

似乎可能有尾随转义字符序列化到字符串中。
是否有一种方法可以返回aud字段返回为String,并且在没有额外字符的情况下进行了清理?
例如"CBr3zBlrKBbwmxOAM1avZQ=="

4

2 回答 2

1

问题是serde_json::to_string()被误认为是实际to_string()实现的情况,而不是 JSON 字符串。

提取枚举变体的内部成员最好通过模式匹配来完成。由于OP的要求,最后一个aud成员Vec是最重要的

最终实现(操场):

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())
    }
}
于 2019-09-30T09:07:49.753 回答
0

如果我正确理解了您在回复@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);
}

操场

于 2019-09-30T14:45:58.253 回答