问题描述
当使用 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 = TRUE
和 flatten = 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)
})