【问题标题】:Converting raw string to string in rust将原始字符串转换为 rust 中的字符串
【发布时间】:2021-11-17 13:39:18
【问题描述】:

我正在使用base64::decode 解码原始字节并得到类似"{\"foo\":1,\"bar\":\"first\"}" 的内容。然而,serde_json 想要一个类似{"foo":1,"bar":"first"}的字符串

所以我需要转换

let raw = r#""{\"foo\":1,\"bar\":\"first\"}""#.to_string();

进入

let converted = "{\"foo\":1,\"bar\":\"first\"}".to_string();

实际上这是可行的:

fn format_string(inp : &str) -> String {
    let temp = inp.to_string().replace("\\\"", "\"");
    if temp.len() < 3 {
        return temp
    }
    temp[1..temp.len()-1].to_string()
}

有没有更好的解决方案?

【问题讨论】:

  • 您的“原始”字符串看起来像一个 JSON 字符串,因此您应该能够对其进行两次反序列化——第一次为String,第二次为您的最终数据结构。跨度>
  • 是的,双重反序列化有效,谢谢!
  • base 64 数据从何而来?修复它的创建可能更有意义,以便它直接包含 JSON 数据,而不是被 JSON 编码两次。
  • 我不确定双重反序列化是否更好

标签: json rust serde


【解决方案1】:

你只需要反序列化一次:

let deserialized: String = serde_json::from_str(&raw).unwrap();

assert_eq!(deserialized, converted)

this rust playground试试吧

原因如下:

let raw = r#""{\"foo\":1,\"bar\":\"first\"}""#.to_string();

raw 表示字符串 "{\"foo\":1,\"bar\":\"first\"}" ,这是一个有效的 JSON。它表示 JSON 字符串而不是 JSON 对象。 可以反序列化为内容为{"foo":1,"bar":"first"}的字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 2013-03-20
    • 2018-04-26
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    相关资源
    最近更新 更多