【问题标题】:Replace Quotation in List of Lists R替换列表 R 中的引用
【发布时间】:2017-11-14 20:42:36
【问题描述】:

我正在尝试从 API 获取 JSON 响应:

test <- GET(url, add_headers(`api_key` = key))

content(test, 'parsed')

当我运行content(test, 'parsed') 时,我收到以下错误:

# Error: lexical error: invalid string in json text. .Note: Final passage of the "fiscal cliff bill" on January 1

我认为这是因为双引号。我该如何替换双引号,或者如果这不是问题,我该如何解决这个问题?

谢谢!

【问题讨论】:

  • create a Minimal, Complete, and Verifiable example,以便我们为您提供适当的帮助。
  • 修复构造不正确的 JSON 是一个巨大的痛苦,尽管我过去使用过正则表达式来做到这一点,xkcd.com/1171
  • 谢谢,r2evans。我决定不尝试修复它,因为 JSON 在太多地方是错误的,增加我的问题计数超过了我当天的最大值。 :)

标签: json r regex api get


【解决方案1】:

所以我有run into a similar problem before,并且我打算编写一个相当函数来使用Jeroen 的修复来尝试修复JSON。由于我还是打算这样做,所以这里有一个快速的 hack 尝试。

注意:修复这样的结构化格式充其量只是推测性的,而且肯定容易出错。好消息是我试图保持足够具体,这样它就不会产生错误的结果:它要么修复它知道它可以修复的东西,要么失败。 “单元测试”确实需要检查其他极端情况。如果您发现某些问题无法解决(并且应该)或无法解决(喘气!),请发表评论

fix_json_quotes <- function(s) {
  if (length(s) != 1) {
    warning("the argument has length > 1 and only the first element will be used")
    s <- s[[1]]
  }
  stopifnot(is.character(s))
  val <- jsonlite::validate(s)
  while (! val) {
    ind <- attr(val, "offset") - 1
    snew <- gsub("(.*)(['\"])([[:space:],]*)$", "\\1\\\\\\2\\3", substr(s, 1, ind))
    if (snew != substr(s, 1, ind)) {
      s <- paste0(snew, substr(s, ind + 1, nchar(s)))
    } else {
      break
    }
    val <- jsonlite::validate(s)
  }
  if (! val) {
    # still not validating
    stop("unable to fix quotes")
  }
  return(s)
}

一些示例数据,如果您愿意,可以进行单元测试(testthat 不需要使用该功能):

library(testthat)
lst <- list(a="final \"cliff bill\" on")
json <- as.character(toJSON(lst))
json
# [1] "{\"a\":[\"final \\\"cliff bill\\\" on\"]}"

好的,应该没有变化:

expect_equal(json, fix_json_quotes(json))

一些不良数据:

# un-escape the double quotes
badlst <- "{\"a\":[\"final \"cliff bill\" on\"]}"
expect_error(jsonlite::fromJSON(badlst))
expect_equal(json, fix_json_quotes(badlst))

PS:这看起来专门用于双引号,仅此而已。但是,我相信这可能也可以修复相关的错误。我为此“留出了空间”,在正则表达式的第二组中(([\"]));例如,如果单引号也可能导致问题,则可以将组更改为([\"'])。我不知道它是否有用甚至是必要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-11
    • 2020-05-23
    • 1970-01-01
    • 2021-07-08
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多