【发布时间】:2017-02-23 23:58:36
【问题描述】:
如果 R 不适合这份工作,那么这很公平,但我相信它应该是。
我正在调用一个 API,然后将结果转储到 Postman json 阅读器中。然后我得到如下结果:
"results": [
{
"personUuid": "***",
"synopsis": {
"fullName": "***",
"headline": "***",
"location": "***",
"image": "***",
"skills": [
"*",
"*",
"*",
"*.",
"*"
],
"phoneNumbers": [
"***",
"***"
],
"emailAddresses": [
"***"
],
"networks": [
{
"name": "linkedin",
"url": "***",
"type": "canonicalUrl",
"lastAccessed": null
},
{
"name": "***",
"url": "***",
"type": "cvUrl",
"lastAccessed": "*"
},
{
"name": "*",
"url": "***",
"type": "cvUrl",
"lastAccessed": "*"
}
]
}
},
{
首先,我不确定如何将其导入 R,因为我主要处理的是 csv。我已经看到人们使用 Json 包直接调用 URL 的其他问题,但这不适用于我正在做的事情,所以我想知道如何读取其中包含 json 的 csv。
我用过:
x <- fromJSON(file="Z:/json.csv")
但也许有更好的方法。完成此操作后,json 看起来更像:
...$results[[9]]$synopsis$emailAddresses
[1] "***" "***"
[3] "***" "***"
$results[[9]]$synopsis$networks...
然后我想要为每个结果存储标题,然后将电子邮件地址存储到数据表中。
我试过了:
str_extract_all(x, 'emailAddresses*$')
但是我认为 * 将代表 emailAddresses 和 $ 之间的所有内容,包括新行等,但这不起作用。我还发现,当你让 * 工作时,它不会提取 * 代表的内容。
例如:
> y <- 'some text. email "oli@oli.o" other text'
> y
[1] "some text. email \"oli@oli.o\" other text"
> str_extract_all(y, 'email \"*"')
[[1]]
[1] "email \""
第 2 部分:
下面的答案有效,但是如果我直接调用 api:
body ='{"start": 0,"count": 105,...}'
x <- POST(url="https://live.*.me/api/v3/person", body=body, add_headers(Accept="application/json", 'Content-Type'="application/json", Authorization = "id=*, apiKey=*"))
y <- content(x)
然后使用
fromJSON(y, flatten=TRUE)$results[c("synopsis.headline",
"synopsis.emailAddresses")]
不起作用。我尝试了以下方法:
z <- NULL
zz <- NULL
for(i in 1:y$count){
z=rbind(z,data.table(job = y$results[[i]]$synopsis$headline))
}
for(i in 1:y$count){
zz=rbind(zz,data.table(job = y$results[[i]]$synopsis$emailAddresses))
}
df <- cbind(z,zz)
但是,当返回 JSON 列表时,有些人有多个电子邮件。因此上面的方法只记录每个人的第一封电子邮件,我如何将多封电子邮件保存为向量(而不是多列)?
【问题讨论】:
-
看看下面的包
rjson,rjson2,feather。祝你好运! -
flatten=T 需要 jsonlite
-
第二部分我想我可以使用 httr,只是不知道如何以上面的格式添加正文,并且与身份验证相同,因为我有一个 id 和一个 api 密钥
标签: json r text-parsing