paste0() 在调用 API 时添加转义前反斜杠?

paste0() adds an escape forward backslash in call to API?

我需要使用以下格式动态调用 API:

 auth_secret <- paste0("Bearer ", secret)

  headers = c(
    `Authorization` = auth_secret,
    `Notion-Version` = '2022-02-22',
    `Content-Type` = 'application/json' )

  res <- httr::PATCH(url = paste0('https://api.notion.com/v1/pages/', id),
                     httr::add_headers(.headers = headers),
                     body = payload,
                     encode = "json")
  d <- httr::content(res)

此负载有效:

payload <- "{\"properties\":{\"Project\":{\"relation\":[{\"id\":\"1d148a9e-783d-47a7-b3e8-2d9c34210355\"}]}}}"

但是如果我想动态创建它,使用 paste0(所以它在函数内部),我会在前后添加一些反斜杠:

payload <- paste0('"{\"properties\":{\"',property_name,'\":{\"relation\":[{\"id\":\"',value,'\"}]}}}"')

print(payload) 

"\"{\"properties\":{\"%7CAK%5E\":{\"relation\":[{\"id\":\"8cb9519e72ca4bbe9e0448807acb8e10\"}]}}}\""

我认为这是由于添加了一些奇怪的转义字符,但 运行 没有想法。我添加了两个 \ 并且遇到了同样的问题。调用失败,因为 JSON 未正确传递。有解决方法吗?

这显然与 paste0 正在转义甚至您不想转义的双引号这一事实有关。

毫无疑问,有人知道细节。然而,当我用 paste0 得到奇怪的东西时,我只使用 sprintf,这在这种情况下似乎有效:

property_name = "Projects"
value = "1d148a9e-783d-47a7-b3e8-2d9c34210355"
payload  <- sprintf(
    "{\"properties\":{\"%s\":{\"relation\":[{\"id\":\"%s\"}]}}}",
    property_name, value
)
print(payload)
# [1] "{\"properties\":{\"Projects\":{\"relation\":[{\"id\":\"1d148a9e-783d-47a7-b3e8-2d9c34210355\"}]}}}"