2017-02-21 37 views
0

我有一个网址,这与我想转换到数据表中的R用下面的代码操纵中的R JSON字符串转换为data.frame

library(jsonlite) 
fromJSON("http://...") 

然而,这一些JSON数据定期更新之前不工作,我认为这是由于JSON的结构。据我了解,该文件目前的结构如下。

{"h1":[{"h2":[{"Name":"Column1Header","Value":"Row1Column1Value"},{"Name":"Column2Header","Value":"Row1Column2Value"}]},{"h2":[{"Name":"Column1Header","Value":"Row2Column1Value"},{"Name":"Column2Header","Value":"Row2Column2Value"}]}]} 

我想如果我能在url中的长字符串读取并操纵它到类似下面是什么,调用函数

fromJSON() 

我将能够获得data.table我想要。

[{"Column1Header":"Row1Column1Value","Column2Header":"Row1Column2Value"},{"Column1Header":"Row2Column1Value","Column2Header":"Row2Column2Value"}] 

任何想法我可以如何实现这一目标?我试图解决这个问题,使用readLines()函数并使用gsub()来替换我不需要的位。但是,readLines正在通过我正在消除各种麻烦的数据来放置“\”,即使我经过我的gsub方法不会非常健壮。

任何帮助将非常感谢阅读文件,因为它现在是不让我进入详细程度,我需要提取“名称,价值”对,我需要建立我的data.table

p.s.有些东西告诉我,由于某些原因,原始JSON文件被转换为列名不一定符合导出系统命名约定。

+0

缺少URL通常表示从违反ToS的站点或无法提及的内部站点刮取数据。我问“这两件事中的哪一件?”知道> 67%的答案缺乏准确性,但我仍然抱着诚实的希望。 – hrbrmstr

+0

根本没有。这些数据是项目数据,只能从我的工作场所内部网访问。目的是让我能够每隔15分钟获得一次这些数据的更新,并让我操作它并发布到Tableau服务器进行报告。 – Ayelavan

回答

0

你需要看看这个帖子中,一个29个upvotes:

A way of unlisting JSON

您的JSON在结构上是有效的。所以,现在的问题是,如果它现在没有长方形的形状,可以将其保存在一个矩形中。

如果可以,切,从上方到这里验证粘贴您的JSON: JSON Viewer

...你可以看到你的H1包括许多帧,将H2几帧,他们都嵌套。

为了在您的数据框中使用它,您需要取消嵌套(取消列出键:值对列表),并将每层数据分配给列。

上述文章采用RJSONIO包装和应用方法与unlist相结合,可快速轻松地完成上述任务。你应该能够调整这个来解开你的数据!

0

喜欢的东西:

library(jsonlite) 
library(purrr) 

x <- '{"h1":[{"h2":[{"Name":"Column1Header","Value":"Row1Column1Value"},{"Name":"Column2Header","Value":"Row1Column2Value"}]},{"h2":[{"Name":"Column1Header","Value":"Row2Column1Value"},{"Name":"Column2Header","Value":"Row2Column2Value"}]}]}' 

res <- fromJSON(x, simplifyVector=FALSE) 

map(res$h1, "h2") %>% 
    map(unlist) %>% 
    map_df(function(x) { 
    y <- names(x) 
    nam <- which(grepl("Name", y)) 
    val <- which(!grepl("Name", y)) 
    setNames(as.list(x[val]), x[nam]) 
    }) 
## # A tibble: 2 × 2 
##  Column1Header Column2Header 
##    <chr>   <chr> 
## 1 Row1Column1Value Row1Column2Value 
## 2 Row2Column1Value Row2Column2Value