jsonlite 数组数组
jsonlite array of arrays
当使用 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)
})
当使用 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)
})