R中的字符向量和JSON

时间:2018-01-04 20:03:56

标签: r

我使用RgetURL调用API,返回JSON响应。

当我在R中查看typeof时,它会给我[1] "character"

我正在尝试以JSON格式存储我的数据,以便能够将其转换为DataTable。可能是什么原因,它是一个字符列表,我该如何解决它?

这是我从API返回的数据中获得的内容:

[1] "HTTP/1.1 200 OK\r\nDate: Thu, 04 Jan 2018 20:38:50 GMT\r\nContent-Type: application/json; charset=utf-8\r\nTransfer-Encoding: chunked\r\nConnection: keep-alive\r\nSet-Cookie: __cfduid=d6bbf45645c3bd5332f83d25d06d8b8ca1515098329; expires=Fri, 04-Jan-19 20:38:49 GMT; path=/; domain=.onesignal.com; HttpOnly\r\nStatus: 200 OK\r\nCache-Control: public, max-age=7200\r\nAccess-Control-Allow-Origin: *\r\nX-XSS-Protection: 1; mode=block\r\nX-Request-Id: bd2552de-bf7d-4a0c-94d6-ff1b6856002a\r\nAccess-Control-Allow-Headers: SDK-Version\r\nETag: W/\"47580e0a23e806945b01f1237219175c\"\r\nX-Frame-Options: SAMEORIGIN\r\nX-Runtime: 0.112902\r\nX-Content-Type-Options: nosniff\r\nX-Powered-By: Phusion Passenger 5.1.4\r\nCF-Cache-Status: REVALIDATED\r\nExpires: Thu, 04 Jan 2018 22:38:50 GMT\r\nServer: cloudflare-nginx\r\nCF-RAY: 3d8100f109c6a23f-ICN\r\n\r\n{\"total_count\":2057,\"offset\":0,\"limit\":50,\"notifications\":[{\"adm_big_picture\":\"\",\"adm_group\":\"\",\"adm_group_message\":{\"en\":\"\... <truncated>

如果我尝试将fromJSON函数与此数据一起使用, 我明白了:

Error in file(con, "r") : cannot open the connection

2 个答案:

答案 0 :(得分:3)

WHERE (CAST(cp.startdate AS DATE) >= CAST(DATEADD(year, -1, DATEADD(month, DATEDIFF(month, 0, getdate()), 0)) AS DATE) OR --FirstDayOfCurrentMonthPriorYear CASE WHEN DATEPART(month,getdate()) = 1 --month is January THEN CAST(DATEADD(month, DATEDIFF(month, 0, getdate())-1, 0) AS DATE) --FirstDayOfLastMonthPriorYear ELSE CAST(DATEADD(year, -1, DATEADD(month, DATEDIFF(month, 0, getdate()) -1, 0)) AS DATE) --FirstDayOfLastMonthPriorYear END) AND CAST(cp.EndDate AS DATE) <= CAST(DATEADD(day, -1, DATEADD(month, DATEDIFF(month, 0, GETDATE()) + 1, 0)) AS DATE) --LastDayOfCurrentMonthCurrentYear 非常适合解析JSON。你的问题是你的JSON前面有很多东西。 (也许之后,也不能告诉......)

我认为JSON从第一个jsonlite::fromJSON开始,所以我们会在此之前删除所有内容。调用您的数据{

x

输入模式into the Regex101 tool的未转义版本以获得解释。 (非转义版本使用单个而不是双反斜杠:x = sub('^[^\\{]*\\{', '{', x) jsonlite::fromJSON(x) 。在R字符串中,我们需要加倍反斜杠。)

以下是基于您的数据的工作示例:

^[^\{]*\{

答案 1 :(得分:0)

您可以使用rjson包将输入转换为json。使用simplifyDataFrame参数fromJSON应输出数据框对象。

Importing data from a JSON file into R

[编辑]

您的数据返回时带有一些标题,您可以克服它从字符串中删除它并传递给fromJSON

library(stringr)
library(rjson)

json <- str_sub(str_extract(data, "ICN\\r\\n\\r\\n.*"), 8)
df <- as.data.frame(fromJSON(json))

> head(df)
   total_count
1        2057