如何从R中的JSON数据解析十六进制代码

时间:2018-12-21 19:44:18

标签: r json hex rvest

我从网络上以以下格式抓取了JSON:

something.light

如果我将数据复制并粘贴到其中,则可以很好地解析:

\x22datetime\x22\x3A\x222019\x2D05\x2D12\x2017\x3A00\x3A00\x22\x7D\x5D

但是,当我将数据导入为文本文件或使用\"datetime\":\"2019-05-12 17:00:00\"}] 从网络上将其抓取时,每个反斜杠都显示为双反斜杠:

rvest

我想知道如何让R将十六进制代码解析为特殊字符,即,它看起来像这样:

\\x22datetime\\x22\\x3A\\x222019\\x2D05\\x2D12\\x2017\\x3A00\\x3A00\\x22\\x7D\\x5D

2 个答案:

答案 0 :(得分:0)

我认为主要问题在于抓取,因为看起来您要导入的实际上是字符串,例如“ \ x22”,而不是编码的“:”。

但是要模拟“如果在提示符下键入此输入将得到什么”,可以使用evalparse,如下所示:

input <- readLines(file) # Or similar
# Next line for testing, note both single and double quotes
input <- '"\\x22datetime\\x22\\x3A\\x222019\\x2D05\\x2D12\\x2017\\x3A00\\x3A00\\x22\\x7D\\x5D"'
result <- eval(parse(text=input))

答案 1 :(得分:0)

对于文本文件中已有的数据,这是解决问题的一种方法。不过,通常来说,R使用的反斜杠与许多其他语言有点不同:只有少数几个允许单个反斜杠(例如\x##\u####\n\b\r\t,也许其他)。文字反斜杠是双反斜杠。由于您的文本文件带有文字反斜杠,后跟“ x”和一些数字,因此R忠实地将它们以文字字符串形式读取,而不是以\x##所代表的十六进制代码形式读取。

s <- '\\x22datetime\\x22\\x3A\\x222019\\x2D05\\x2D12\\x2017\\x3A00\\x3A00\\x22\\x7D\\x5D'

这部分匹配\x的任何实例,但是由于它是R,所以我们需要\\\\来表示文字\……很奇怪,我知道。我们还捕获了以下两个十六进制数字:

gre <- gregexpr("\\\\x[0-9a-fA-F]{2}", s)
regm <- regmatches(s, gre)[[1]]
regm
#  [1] "\\x22" "\\x22" "\\x3A" "\\x22" "\\x2D" "\\x2D" "\\x20" "\\x3A" "\\x3A" "\\x22" "\\x7D"
# [12] "\\x5D"

有了这个regm,我们可以使用十六进制转换和一些raw函数来转换为真正的ascii字符:

sapply(as.raw(strtoi(substr(regm, 3, 4), 16L)), rawToChar)
#  [1] "\"" "\"" ":"  "\"" "-"  "-"  " "  ":"  ":"  "\"" "}"  "]" 

函数regmatches不仅提取字符串中的特定模式,还可以替换

regmatches(s, gre) <- list(sapply(as.raw(strtoi(substr(regm, 3, 4), 16L)), rawToChar))
s
# [1] "\"datetime\":\"2019-05-12 17:00:00\"}]"