如何“命名”每个JSON对象

问题描述 投票:0回答:1

我确信这是一件很简单的事情,但我无法弄清楚。

我在R中有一个数据帧,看起来像这样:

a   b   c
1   9   J
2   5   K

当我使用toJSON并将数据帧作为命名列表传递时

val <- toJSON(list( table = df), pretty = TRUE)

我得到:

{  "table":[
   {
     {
       "a":"1",
       "b":"9",
       "c":"J"
     }
   },
   {
     {
       "a":"2",
       "b":"5",
       "c":"K"
     }
   }
 ]
}

如何将每个JSON对象命名为“ entry”,如下所示:

{  "table":[
   {
     "entry":{
       "a":"1",
       "b":"9",
       "c":"J"
     }
   },
   {
     "entry":{
       "a":"2",
       "b":"5",
       "c":"K"
     }
   }
 ]
}
r json object jsonlite
1个回答
1
投票

由于{"entry":{"a":1,"b":9,"c":"J"}}对象的原因,获得所需的结构有点复杂

要获得此结构,您需要有一个命名列表

lst <- list( list(a = 1, b = 9, c = "J") )
attr( lst, "names" ) <- "entry"

toJSON( lst, auto_unbox = TRUE )
# {"entry":{"a":1,"b":9,"c":"J"}}

因此data.frame的每一行都必须是一个命名列表

res <- lapply( seq_len( nrow( df ) ), function(i) {
  lst <- list( as.list( df[i, , drop = F] ) )
  attr( lst, "names" ) <- "entry"
  lst
})

## add the 'table'
res <- list( table = res )

toJSON( res, auto_unbox = TRUE, pretty = TRUE )
# {
#   "table": [
#     {
#       "entry": {
#         "a": 1,
#         "b": 9,
#         "c": "J"
#       }
#     },
#     {
#       "entry": {
#         "a": 2,
#         "b": 5,
#         "c": "K"
#       }
#     }
#   ]
# } 

© www.soinside.com 2019 - 2024. All rights reserved.