我正在尝试解析以阵列数组形式出现的JSON(想想数据表)。问题是该表可能包含数组或映射作为元素,这些元素可能为空。这是一个例子:
json <- '[[1,"foo",[],{}],[1,"bar",[1],{"foo":"bar"}]]'
# Result is a list of 2 where each sublist is of length 4
jsonlite::fromJSON(json)
# Result is a character vector of length 6
> unname(unlist(jsonlite::fromJSON(json)))
[1] "1" "foo" "1" "bar" "1" "bar"
因此,当我尝试将其转换为2×4矩阵时,我得到了错误的答案。我希望[]
映射到字符串"[]"
和{}
到"{}"
,这样我就不会丢失元素。我完全可以将嵌套数组作为"[1]"
返回,而不是将其解析为列表。对我来说,这似乎我需要告诉json解析器停止递归并将元素视为特定点上的字符,但我无法弄清楚如何执行此操作。我没有与jsonlite包绑在一起所以基本上任何东西都是合理的游戏,只要它不慢。
答案 0 :(得分:1)
您可以递归迭代已解析的json以查找空列表,并将其替换为您想要的值。例如
renameEmptyLists <- function(x) {
if (is.list(x)) {
if( length(x)==0 ) {
return(if(!is.null(names(x))) { "{}" } else {"[]"} )
} else {
return(lapply(x, renameEmptyLists))
}
} else {
x
}
}
jj <- jsonlite::fromJSON(json)
unname(unlist(renameEmptyLists(jj)))
# [1] "1" "foo" "[]" "{}" "1" "bar" "1" "bar"
要清楚,你在哪里&#34;失去&#34;他们在unlist()
期间。如果您查看我的示例中的jj
对象,您将看到解析正确地标识了空列表和空命名列表。