【问题标题】:jsonlite array of arraysjsonlite数组数组
【发布时间】:2021-08-27 13:09:35
【问题描述】:

当使用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 以摆脱这个未命名的列表?

【问题讨论】:

    标签: r json jsonlite


    【解决方案1】:

    问题是,只要有 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)
    })
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多