我已经花了将近一个小时在这上面,所以这是一个真正的碰壁的案例。
由于我无法控制的原因,我使用的一个内部服务提供给我一个如下格式的JSON
let dirty_string = r#"\"{\\\"key1\\\":\\\"val1\\\",\\\"key2\\\":\\\"val2\\\"}\""#;
很明显这看起来不对。我计划使用serde_json
来构造适当的结构体,但这不起作用。
我已经尝试了各种方法来消除多重逃逸。
我已经尝试了各种形式的使用替换
这一let to_format = dirty_string.replace("\\\\", r#""#);
给出了这个"\\\"{\\\"key1\\\":\\\"val1\\\",\\\"key2\\\":\\\"val2\\\"}\\\""
基本上使事情变得更糟
这个let to_format = dirty_string.replace("\\", r#""#);
给出了这个"\"{\"key1\":\"val1\",\"key2\":\"val2\"}\""
看起来差不多了,但是不起作用,因为当我试图将它解析为结构体时失败了
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
struct Parsed {
key1: String,
key2: String
}
let to_struct: Parsed = serde_json::from_str(&to_format).unwrap();
dbg!(to_struct);
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error("invalid type: string \"{\", expected struct Parsed", line: 1, column: 3)', src/main.rs:440:62
stack backtrace:
0: rust_begin_unwind
所以我真的很感激你的帮助。
我如何才能成功地删除这个讨厌的反斜杠,使它成为一个有效的json字符串,然后我可以解析到结构。
2条答案
按热度按时间flvlnr441#
您可以添加引号并将其放入
serde_json
的三次迭代中:omjgkv6w2#
您所拥有的是一个JSON字符串,它再次被编码为JSON,最后具有反斜杠转义的字符(有PHP的
addslashes()
的味道)。因此,您需要按顺序执行这些步骤:例如:
该输出: