rust 避免/删除serde_json中的转义引号

xdnvmnnf  于 2023-03-02  发布在  其他
关注(0)|答案(1)|浏览(302)

我尝试用serde_json::json!创建一个JSON对象,但问题是我得到了\",但我不想要它们。我该如何阻止或删除它们?

fn create_cache_json(token: &str, change: &str, payload: Vec<Value>) -> Value {
   let json = serde_json::json!(
       {
           "token": token,  
           "change": change, 
           "data": {
               "payload": payload
           }
       });
   
   
   info!("{}", json);

   return json;
}

此代码返回

{
   "change": "\"new\"",
   "data": {
       "payload":[]
   },
   "token": "\"2a256356\""
}

**编辑:**输入值为:

fn main() {
    let token: &str = "foo".to_string();
    let change: &str = "new".to_string();
    let payload: Vec<serde_json::Value> = Vec::new();
 
    create_cache_json(token, change, payload);
}

输入是已经有引号的文字。
令牌输出为:"foo",但它应该是foo。使用像quote这样的板条箱不起作用,因为值必须是字符串。对于此函数,有效负载应该为空。

wz8daaqr

wz8daaqr1#

我通过将json!函数更改为format!,然后从String创建一个Value来修复它。
下面是使用给定参数创建JSON对象的代码。这应该适用于每种数据类型。如果其他人需要这个:

fn create_json(
     token: String, 
     change: String, 
     payload: Vec<Value>
) -> CacheEntry {

    let body: String = format!(
        "{{\"token\": {token}, \"change\": {change}, \"data\": [{:#?}] }}"
        , payload);
    let json: CacheEntry = serde_json::from_str(&body).unwrap();

    return json;
}
    • EDIT:**正如Charles Duffy所说,上面的代码容易受到注入攻击,下面是一个更好的解决方案:

问题中的代码已经正确,但输入字符串错误。输入字符串文字应转换为as.str(),而不是使用to_string(),如下所示:
x一个一个一个一个x一个一个二个x

相关问题