2016-06-28 37 views
1

解析與像反斜線特殊字符存儲在本地JSON文件「\」我無法解析本地存儲的JSON文件它看起來像這 -無法R中

[{"status_code":200,"operation_id":"13-10","response":"{\"emails\": 
[{\"campaign_id\":\"1111111\",\"email_address\":\"[email protected]\",\"activity\": 
[]},{\"campaign_id\":\"22222\",\"email_address\":\"[email protected]\",\"activity\":[]}}}] 

我使用jsonlite 正如你可以看到這個\無處不在,我無法解析它。 當我做 -

st<-fromJSON("/Users/frantr/this_is_R/open_files/json_file.json") 
print(st) 

我得到這個 -

$ : chr "[{\"status_code\":200" 
$ : chr "\"operation_id\":\"13-10\"" 
$ : chr "\"response\":\"{\\\"emails\\\": [{\\\"campaign_id\\\":\\\"1111111\\\"" 
$ : chr "\\\"email_address\\\":\\\"111111111\\\"" 
$ : chr "\\\"activity\\\":[]}" 

任何人都可以請幫忙,謝謝。

+0

W這個串是從哪裏來的?你的*文件*是這樣的還是你在查看窗口中檢查了一個值?你得到一個實際的錯誤? '\'是字符串中使用的轉義字符,它允許你輸入真正特殊的字符,比如''',它實際上不存在於字符串中。所有的編程語言都有一種方法來轉義特殊字符。 C,C++,C#,Java,Markdown和其他人,這個字符是'\' –

+0

我的文件只是這樣,我如何將這個json文件轉換爲csv格式,3列爲「email_address」,「campaign_id」 ,「活動」?謝謝 – frant

回答

1

能你檢查你的JSON字符串是如何生成的?有幾個問題,例如在第一個內部{(之後response:)之前的額外"以及缺少]

然後,如您懷疑\是造成問題。所以我使用readLines並一步刪除\。這JSON然後可以使用jsonlite::fromJSON

例如閱讀,我有我的桌面上名爲myJson.json,其中包含此字符串

[{"status_code":200,"operation_id":"13-10","response":{\"emails\":[{\"campaign_id\":\"1111111\",\"email_address\":\"[email protected]\",\"activity\":[]},{\"campaign_id\":"22222\",\"email_address\":\"[email protected]\",\"activity\":[]}]}}] 

上的一個文件然後我就可以使用

lst <- fromJSON(gsub("\\\\","",readLines("~/Desktop/myJson.json"))) 

str(lst) 
# 'data.frame': 1 obs. of 3 variables: 
# $ status_code : int 200 
# $ operation_id: chr "13-10" 
# $ response :'data.frame': 1 obs. of 1 variable: 
# ..$ emails:List of 1 
# .. ..$ :'data.frame': 2 obs. of 3 variables: 
# .. .. ..$ campaign_id : chr "1111111" "22222" 
# .. .. ..$ email_address: chr "[email protected]" "[email protected]" 
# .. .. ..$ activity  :List of 2 
# .. .. .. ..$ : list() 
# .. .. .. ..$ : list() 

閱讀然後,您可以從此列表中獲取所需的任何組件/數據

lst$response$emails 

# [[1]] 
# campaign_id email_address activity 
# 1  1111111  [email protected]  NULL 
# 2  22222  [email protected]  NULL 
+0

感謝您的快速響應,但我正在從本地保存的json文件中讀取json文件,像這樣 - lst <-fromJSON(「/ Users/frantr/this_is_R/open_files/json_file.json」)但lst不是列表,它是一個數據框架,一個非常奇怪的數據框架。你能幫我解答一下嗎,謝謝。 – frant

+0

是的,我正在使用jsonlite,我做到了 - st <-fromJSON(「/ Users/frantr/this_is_R/open_files/json_file.json」)。 – frant

+0

我已經更新了問題並顯示了輸出,謝謝。 – frant

1

這可以幫助我猜。

library(RJSONIO) 

    file <- '[{"status_code":200,"operation_id":"13-10","response":"{\"emails\":[{\"campaign_id\":\"1111111\",\"email_address\":\"[email protected]\",\"activity\":[]},{\"campaign_id\":\"22222\",\"email_address\":\"[email protected]\",\"activity\":[]}}}]' 

    json <- fromJSON(file, nullValue = NA) 

    dat <- lapply(json, function(j) { 
     as.data.frame(replace(j, sapply(j, is.list), NA)) 
    }) 


    library(plyr) 
    res <- rbind.fill(dat) 

    > res 
     status_code operation_id response 
    1   200  13-10  NA 
+0

感謝您的回覆,我只想問你一個問題,如何將這個json文件轉換爲csv格式,其中3列爲「email_address」,「campaign_id」,「活動「?謝謝 – frant

+0

首先將其轉換爲數據框,然後寫入csv。'res < - data.frame(rbind.fill(dat))'和'write.csv(res,」res.csv「 ,row.names = F)' –

1

首先您的JSON是無效 我已經驗證了您的JSON:

[{"status_code":200,"operation_id":"13-10","response":"{\"emails\":[{\"campaign_id\":\"1111111\",\"email_address\":\"[email protected]\",\"activity\":[]},{\"campaign_id\":\"22222\",\"email_address\":\"[email protected]\",\"activity\":[]}]}"}] 

和使用jsonlite包加載它,它是工作的罰款:

library(jsonlite) 
json = fromJSON("pathTofile.json") 
json 

    status_code operation_id 
1   200  13-10 
                                      response 
1 {"emails":[{"campaign_id":"1111111","email_address":"[email protected]","activity":[]},{"campaign_id":"22222","email_address":"[email protected]","activity":[]}]} 
+0

我的JSON也出現錯誤。 – SymbolixAU

+0

感謝您的快速回復。我只想問你一個問題,我該如何將這個json文件轉換爲csv格式,其中3列爲「email_address」,「campaign_id」,「Activity」?謝謝。 – frant