首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jsonlite阵列

jsonlite阵列
EN

Stack Overflow用户
提问于 2021-06-10 13:56:02
回答 1查看 156关注 0票数 2

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

代码语言:javascript
复制
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"

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

代码语言:javascript
复制
myjson[["type"]][["face"]][["eyes"]]
NULL

相反,我需要添加"[1]“,以便使其发挥作用:

代码语言:javascript
复制
myjson[["type"]][["face"]][[1]][["eyes"]]
[1] "blues"

有什么想法吗?我如何格式化json以去掉这个未命名的列表?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-10 17:21:18

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

所做的工作是应用一个函数,将任何只有单个对象的未命名列表转换为该对象本身。

代码语言:javascript
复制
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)
})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67922621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档