如何在没有"失去"的情况下解析R中的JSON空元素

时间:2015-01-22 16:39:53

标签: json r

我正在尝试解析以阵列数组形式出现的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包绑在一起所以基本上任何东西都是合理的游戏,只要它不慢。

1 个答案:

答案 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对象,您将看到解析正确地标识了空列表和空命名列表。