无法解析本地存储的 JSON 文件,其中包含 R 中的反斜杠“\”等特殊字符
Unable to parse locally stored JSON file with special character like backslash "\" in R
我无法解析本地存储的 JSON 文件,它看起来像这样-
[{"status_code":200,"operation_id":"13-10","response":"{\"emails\":
[{\"campaign_id\":\"1111111\",\"email_address\":\"1111@111\",\"activity\":
[]},{\"campaign_id\":\"22222\",\"email_address\":\"2222@2222\",\"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\\":[]}"
谁能帮帮忙,谢谢。
这可以帮助我猜测。
library(RJSONIO)
file <- '[{"status_code":200,"operation_id":"13-10","response":"{\"emails\":[{\"campaign_id\":\"1111111\",\"email_address\":\"1111@111\",\"activity\":[]},{\"campaign_id\":\"22222\",\"email_address\":\"2222@2222\",\"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
首先你的json无效
我已经验证了你的 json:
[{"status_code":200,"operation_id":"13-10","response":"{\"emails\":[{\"campaign_id\":\"1111111\",\"email_address\":\"1111@111\",\"activity\":[]},{\"campaign_id\":\"22222\",\"email_address\":\"2222@2222\",\"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":"1111@111","activity":[]},{"campaign_id":"22222","email_address":"2222@2222","activity":[]}]}
您能检查一下您的 JSON 字符串是如何生成的吗?它有几个问题,例如在第一个内部 {
之前(在 response:
之后)有一个额外的 "
,并且缺少一个 ]
.
然后,正如您所怀疑的那样,\
导致了问题。所以我使用 readLines
并一步删除 \
。然后可以使用 jsonlite::fromJSON
读取此 JSON
例如,我的桌面上有一个名为 myJson.json
的文件,其中包含此字符串
[{"status_code":200,"operation_id":"13-10","response":{\"emails\":[{\"campaign_id\":\"1111111\",\"email_address\":\"1111@111\",\"activity\":[]},{\"campaign_id\":"22222\",\"email_address\":\"2222@2222\",\"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 "1111@111" "2222@2222"
# .. .. ..$ activity :List of 2
# .. .. .. ..$ : list()
# .. .. .. ..$ : list()
然后你可以从这个列表中得到你想要的任何东西components/data
lst$response$emails
# [[1]]
# campaign_id email_address activity
# 1 1111111 1111@111 NULL
# 2 22222 2222@2222 NULL
我无法解析本地存储的 JSON 文件,它看起来像这样-
[{"status_code":200,"operation_id":"13-10","response":"{\"emails\":
[{\"campaign_id\":\"1111111\",\"email_address\":\"1111@111\",\"activity\":
[]},{\"campaign_id\":\"22222\",\"email_address\":\"2222@2222\",\"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\\":[]}"
谁能帮帮忙,谢谢。
这可以帮助我猜测。
library(RJSONIO)
file <- '[{"status_code":200,"operation_id":"13-10","response":"{\"emails\":[{\"campaign_id\":\"1111111\",\"email_address\":\"1111@111\",\"activity\":[]},{\"campaign_id\":\"22222\",\"email_address\":\"2222@2222\",\"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
首先你的json无效 我已经验证了你的 json:
[{"status_code":200,"operation_id":"13-10","response":"{\"emails\":[{\"campaign_id\":\"1111111\",\"email_address\":\"1111@111\",\"activity\":[]},{\"campaign_id\":\"22222\",\"email_address\":\"2222@2222\",\"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":"1111@111","activity":[]},{"campaign_id":"22222","email_address":"2222@2222","activity":[]}]}
您能检查一下您的 JSON 字符串是如何生成的吗?它有几个问题,例如在第一个内部 {
之前(在 response:
之后)有一个额外的 "
,并且缺少一个 ]
.
然后,正如您所怀疑的那样,\
导致了问题。所以我使用 readLines
并一步删除 \
。然后可以使用 jsonlite::fromJSON
例如,我的桌面上有一个名为 myJson.json
的文件,其中包含此字符串
[{"status_code":200,"operation_id":"13-10","response":{\"emails\":[{\"campaign_id\":\"1111111\",\"email_address\":\"1111@111\",\"activity\":[]},{\"campaign_id\":"22222\",\"email_address\":\"2222@2222\",\"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 "1111@111" "2222@2222"
# .. .. ..$ activity :List of 2
# .. .. .. ..$ : list()
# .. .. .. ..$ : list()
然后你可以从这个列表中得到你想要的任何东西components/data
lst$response$emails
# [[1]]
# campaign_id email_address activity
# 1 1111111 1111@111 NULL
# 2 22222 2222@2222 NULL