繁体   English   中英

R中的字符向量和JSON

[英]character vector and JSON in R

我使用getURLR调用了API,该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

jsonlite::fromJSON非常适合解析JSON。 您的问题是JSON前面有很多东西。 (也许以后也无法分辨...)

我认为JSON从第一个{开始,因此我们将在此之前删除所有内容。 调用数据x

x = sub('^[^\\{]*\\{', '{', x)
jsonlite::fromJSON(x)

在Regex101工具中键入模式的未转义版本以进行解释。 (未转义的版本使用单反斜杠: ^[^\\{]*\\{ 。在R字符串中,我们需要将反斜杠翻倍。)

这是一个基于您的数据的工作示例:

x = 'HTTP/1.1 200 OK
Date: Thu, 04 Jan 2018 20:38:50 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __cfduid=d6bbf45645c3bd5332f83d25d06d8b8ca1515098329; expires=Fri, 04-Jan-19 20:38:49 GMT; path=/; domain=.onesignal.com; HttpOnly
Status: 200 OK
Cache-Control: public, max-age=7200
Access-Control-Allow-Origin: *
X-XSS-Protection: 1; mode=block
X-Request-Id: bd2552de-bf7d-4a0c-94d6-ff1b6856002a
Access-Control-Allow-Headers: SDK-Version
ETag: W/\"47580e0a23e806945b01f1237219175c\"
X-Frame-Options: SAMEORIGIN
X-Runtime: 0.112902
X-Content-Type-Options: nosniff
X-Powered-By: Phusion Passenger 5.1.4
CF-Cache-Status: REVALIDATED\r\nExpires: Thu, 04 Jan 2018 22:38:50 GMT
Server: cloudflare-nginx
CF-RAY: 3d8100f109c6a23f-ICN
{\"total_count\":2057,\"offset\":0,\"limit\":50,\"notifications\":[{\"adm_big_picture\":\"\",\"adm_group\":\"\"}]}'

y = gsub('^[^\\{]*\\{', '{', x)
jsonlite::fromJSON(sub('^(^\\{)*\\{', '{', y))
# $total_count
# [1] 2057
# 
# $offset
# [1] 0
# 
# $limit
# [1] 50
# 
# $notifications
#   adm_big_picture adm_group
# 1                      

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

将数据从JSON文件导入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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM