2014-07-20 97 views
1

我試圖在R中將'JSON'文件變成一個數據幀並且沒有太大的成功。用'非標準格式'解析R中的JSON文件

我試過使用RJSON和RJSONIO,但兩者似乎都對我的數據格式有相同的異議,只返回第一組{}之間的值。這是我的數據的一個例子:

{"response time":"1075","_p":"99ae8e5f1eb64091c019e57ff0e686d3","_t":1397514301} 
{"_n":"searcher","version":"v4","mobile":"No","_p":"1797370","_t":1397514315} 
{"month":"April","_n":"shown availability","availability":"unavailable","_t":1397514320} 

這是究竟如何看,如果我在記事本++打開它 - 你可以看到有間} {沒有逗號。

目標是將它變成一個表格,每個{}作爲一行,每列有一列,例如, 「_p」,「_n」,「_t」等。我知道我可以使用plyr來處理我的數據的鋸齒狀本質。

任何幫助如何解決這個問題將不勝感激。

+0

請提供一個數據框應該如何在R中查看的例子。 –

+0

另外,您可以在每個樣本行的末尾添加一個逗號,分別用'gsub(「\\ n」,「,\ n」, X)'。這只是用一個逗號替換新行字符,然後換行符。或 'gsub(「} {」,「},{」,x,fixed = TRUE)'如果大括號之間沒有換行符。 –

+0

感謝理查德,擴大了這個問題,給出了輸出的簡要總結。我如何將gsub合併到fromJSON函數中? – Jacob

回答

2
text <- '{"response time":"1075","_p":"99ae8e5f1eb64091c019e57ff0e686d3","_t":1397514301} 
{"_n":"searcher","version":"v4","mobile":"No","_p":"1797370","_t":1397514315} 
{"month":"April","_n":"shown availability","availability":"unavailable","_t":1397514320}' 


library(rjson) 
json.text <- readLines(textConnection(text)) 
# parse JSON into named list 
json  <- lapply(json.text,fromJSON) 
library(plyr) 
result <- do.call(rbind.fill,lapply(json,as.data.frame,optional=T)) 
result 
# response time        _p   _t     _n version mobile month availability 
# 1   1075 99ae8e5f1eb64091c019e57ff0e686d3 1397514301    <NA> <NA> <NA> <NA>   <NA> 
# 2   <NA>       1797370 1397514315   searcher  v4  No <NA>   <NA> 
# 3   <NA>        <NA> 1397514320 shown availability <NA> <NA> April unavailable 

注:

  1. 你JSON是畸形的結尾:,"trip "_t":1397514320}不會解析。所以如果這是你的實際文本文件,我不知道該怎麼處理它。在這個例子中,我刪除了"trip,將最後一個變量保留爲"_t"
  2. 您需要optional=Tas.data.frame(...)將嘗試「更正」列名稱,特別是通過將X預先設置爲以_開頭的那些名稱。

編輯對評論主題的迴應。

如果你的JSON有反斜槓字符,你可以在調用中unexpected.escape=...參數設置爲fromJSON(...),如:但是

json  <- lapply(json.text,fromJSON,unexpected.escape="keep") 

請注意,您的文件也必須是結構良好的JSON - 無失}等等。否則fromJSON(...)將失敗。

+0

這看起來非常有前途。我無法解決的一件事是如何從文件中導入數據,而不是直接將文本導入到變量中?在這種情況下,我的文件被稱爲「testdata.json」。謝謝。 (順便說一下,你是正確的修復格式不正確的數據,當我試圖使其更具可讀性時,我的錯誤。) – Jacob

+0

使用'json.text < - readLines(「testdata.json」)' – jlhoward

+0

好吧。變得非常接近!這並不奏效,我想是因爲readLines()對json數據做了一些奇怪的事情。這裏是一行:[1]「{\」response time \「:\」1075 \「,\」_ p \「:\」99ae8e5f1eb64091c019e57ff0e686d3 \「,\」_ t \「:1397514301},」 – Jacob