【问题标题】:Reading unescaped backslashes in JSON into R将 JSON 中未转义的反斜杠读入 R
【发布时间】:2013-11-19 09:03:20
【问题描述】:

我正在尝试将 Facebook Graph API Explorer 中的一些数据读取到 R 中以进行一些文本分析。但是,JSON 提要中似乎有未转义的反斜杠,这导致 rjson 出错。以下是导致问题的输入类型的一个最小示例。

library(rjson)
txt <- '{"data":[{"id":2, "value":"I want to \\"post\\" a picture\\video"}]}'
fromJSON(txt)

(请注意,\\"\\video 处的双反斜杠在解析后将转换为单反斜杠,这是我实际数据中的内容。)

我还尝试了 RJSONIO 包,它也会出错,有时甚至会导致 R 崩溃。

以前有人遇到过这个问题吗?有没有办法解决这个问题,而不是手动查找出现的每个错误?解析可能有数兆字节的 JSON,错误消息并不能很好地说明问题输入的确切位置。

【问题讨论】:

    标签: json r facebook-graph-api escaping rjson


    【解决方案1】:

    只需用双反斜杠替换反斜杠不会转义双引号、制表符或换行符

    在正则表达式中,'\\\\' 被转换为一个反斜杠(需要两级转义,一级用于 R,一级用于正则表达式引擎)。我们需要 perl 正则表达式引擎才能使用前瞻。

    library(stringr)
    txt2 <- str_replace_all(txt, perl('\\\\(?![tn"])'), '\\\\\\\\')
    fromJSON(txt2)
    

    【讨论】:

    • 谢谢。但这不起作用,因为还有像 \" 这样的字符来表示转义的引号文字。 IOW,有时反斜杠是正确的,有时需要修改。
    • 我已经修改了我的例子来澄清。
    • @HongOoi 好的,我已经更新了我的答案。最佳解决方案取决于 JSON 的错误程度。如果它们是随机的单反斜杠或双反斜杠,您可能需要手动更正。
    • 是的,我刚刚找到了以下 sn-p:"message":"Ok thank you :)\" 请注意结尾引号之前未转义的 \。真是一团糟。似乎无法绕过手动校正。
    • 您是否尝试过使用unexpected.escape = "keep",至少可以防止错误并将某些内容读入R?
    【解决方案2】:

    问题是你试图解析无效的 JSON:

    library(jsonlite)
    txt <- '{"data":[{"id":2, "value":"I want to \\"post\\" a picture\\video"}]}'
    validate(txt)
    

    问题在于 picture\\video 部分,因为 \v 不是有效的 JSON 转义序列,即使它是 R 和其他一些语言中的有效转义序列。也许你的意思是:

    library(jsonlite)
    txt <- '{"data":[{"id":2, "value":"I want to \\"post\\" a picture\\/video"}]}'
    validate(txt)
    fromJSON(txt)
    

    问题的任何一种方式都在于生成无效 JSON 的 JSON 数据源。如果这些数据真的来自 Facebook,那么您在他们的 API 中发现了一个错误。但更有可能您没有正确检索它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-10
      • 2015-05-19
      • 2020-08-24
      • 1970-01-01
      • 2015-09-21
      • 2011-11-09
      • 2017-04-21
      • 1970-01-01
      相关资源
      最近更新 更多