如何在serde_json中避免或移除JSON字符串的转义引号?
解决serde_json::json!生成JSON时出现多余转义引号的问题
问题根源
你遇到的问题本质是传入的字符串本身包含双引号(比如实际传入的token是"\"foo\""而非"foo"),serde_json会严格按照JSON标准序列化字符串,因此会对原字符串中的引号进行转义,最终输出的JSON值就会呈现为"foo"(对应原始字符串"\"foo\""的序列化结果)。
解决方案
核心思路是在构建JSON之前,先去除输入字符串两端的多余引号。以下是两种可行的实现方式:
方式1:在json!宏内直接处理
直接在构建JSON对象时,对输入字符串做去引号处理:
use serde_json::{json, Value}; use log::info; fn create_cache_json(token: String, change: String, payload: Vec<Value>) -> Value { // 辅助函数:去除字符串两端的双引号,同时清理前后空白 let strip_surrounding_quotes = |s: &str| { let trimmed = s.trim(); trimmed.strip_prefix('"') .and_then(|s| s.strip_suffix('"')) .unwrap_or(trimmed) }; let json = json!({ "token": strip_surrounding_quotes(&token), "change": strip_surrounding_quotes(&change), "data": { "payload": payload } }); info!("{}", json); json } fn main() { // 模拟带引号的输入场景 let token = "\"foo\"".to_string(); let change = "\"new\"".to_string(); let payload: Vec<Value> = Vec::new(); create_cache_json(token, change, payload); }
方式2:提前预处理输入
如果所有输入字符串都存在多余引号,可以在传入函数前先处理:
use serde_json::{json, Value}; use log::info; fn create_cache_json(token: String, change: String, payload: Vec<Value>) -> Value { let json = json!({ "token": token, "change": change, "data": { "payload": payload } }); info!("{}", json); json } fn main() { let raw_token = "\"foo\"".to_string(); // 去除两端的双引号和空白字符 let token = raw_token.trim().trim_matches('"').to_string(); let raw_change = "\"new\"".to_string(); let change = raw_change.trim().trim_matches('"').to_string(); let payload: Vec<Value> = Vec::new(); create_cache_json(token, change, payload); }
注意事项
不要试图让serde_json跳过引号转义——这会破坏JSON的语法规范,导致生成的JSON无法被其他解析器正常读取。正确的做法始终是先确保输入数据符合预期格式,再进行序列化。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

