2017-02-21 73 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