jsonlite 数组数组

问题描述

当使用 jsonlite 导入一个在其他数组中包含数组的 json 时,我得到一个不需要的未命名列表。示例如下:

myjson=jsonlite::fromJSON('{
  "class" : "human","type" : [{ 
  "shape":"thin","face":[{"eyes":"blues","hair":"brown"}]
}]
}')

str(myjson)

List of 2
 $ class: chr "human"
 $ type :'data.frame':  1 obs. of  2 variables:
  ..$ shape: chr "thin"
  ..$ face :List of 1
  .. ..$ :'data.frame': 1 obs. of  2 variables:
  .. .. ..$ eyes: chr "blues"
  .. .. ..$ hair: chr "brown"

我想访问下面的“眼睛”字段(但它不起作用):

myjson[["type"]][["face"]][["eyes"]]
NULL

相反,我需要添加“[[1]]”以使其正常工作:

myjson[["type"]][["face"]][[1]][["eyes"]]
[1] "blues"

任何想法如何格式化 json 以摆脱这个未命名的列表?

解决方法

问题是,只要有 JSON 向量 [{},{},...],就会使用未命名列表。您的第一个向量变成了一个命名列表,而第二个内部向量变成了一个未命名列表,这是因为 jsonlite::fromJSON 默认有参数 simplifyDataFrame = TRUEflatten = TRUE,它们有这种行为。我没有查看源代码,但似乎所涉及的简化(将只有一个元素的向量转换为命名列表)只是简化了顶级对象。

解决方法是应用一个函数,将任何只有一个对象的未命名列表转换为对象本身。

my_json <- lapply(my_json,function(x) {
    if (is.list(x)) # if element is a list,replace it with its first element
        return(lapply(x,function(y) {
            return(y[[1]])
        }))
    else
        return(x)
})