rust - 将 Claims 字段反序列化为字符串会返回其他字符

标签 rust escaping serde-json

我需要反序列化以下有效负载,特别是来自 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 时,它会返回两个额外的字符,一个开始字符和一个结束字符。

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)

看起来可能有序列化到字符串中的尾随转义字符。
是否有一种方法可以返回作为 String 返回的 aud 字段,经过清理后没有多余的字符?
例如“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())
    }
}

关于rust - 将 Claims 字段反序列化为字符串会返回其他字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58161775/

相关文章:

rust - 序列化 null 值或默认值时如何避免生成 JSON?

vector - 在 Rust 中重复向量中元素的最佳方法是什么?

scope - 跨多个模块访问单例

rust - 尝试从包含在 RefCell 中的结构中借用 2 个字段时出错

php - 从 IOS 到 php 服务的 Base64 图像

rust - 函数返回 serde 反序列化类型时如何修复生命周期错误?

rust - 如何编写显示错误并退出程序的函数的签名?

grails - 在grails条件中转义关联名称不与包含类变量名称冲突

vim - 在 Emacs viper 模式下禁用 ESC 作为元数据?

rust - 函数局部变量的生命周期不够长