我有如下所示的数据
testdf <- data.frame(timestamp=c("2015-07-22T02:00:00", "2015-07-22T03:00:00", "2015-07-22T04:00:00"), PM2.5=c(25.48, 25.09, 26.26), stringsAsFactors = FALSE)
> testdf
timestamp PM2.5
1 2015-07-22T02:00:00 25.48
2 2015-07-22T03:00:00 25.09
3 2015-07-22T04:00:00 26.26我想要JSON格式如下所示。
{
"data":[{"timestamp": "2015-07-22T02:00:00", "value": {"PM2.5": 25.48}},
{"timestamp": "2015-07-22T03:00:00", "value": {"PM2.5": 25.09}},
{"timestamp": "2015-07-22T04:00:00", "value": {"PM2.5": 26.26}}]
}因此,我试图将我的目标JSON转换为dataframe,以观察dataframe是怎样的
json <- '{
"data":[{"timestamp": "2015-07-22T02:00:00", "value": {"PM2.5": 25.48}},
{"timestamp": "2015-07-22T03:00:00", "value": {"PM2.5": 25.09}},
{"timestamp": "2015-07-22T04:00:00", "value": {"PM2.5": 26.26}}]
}'
tmp <- fromJSON(json)
> tmp
$data
timestamp PM2.5
1 2015-07-22T02:00:00 25.48
2 2015-07-22T03:00:00 25.09
3 2015-07-22T04:00:00 26.26然后,我将testdf转换为tmp。
> testL <- list(testdf)
> names(testL) <- c("data")
> testL
$data
timestamp PM2.5
1 2015-07-22T02:00:00 25.48
2 2015-07-22T03:00:00 25.09
3 2015-07-22T04:00:00 26.26嗯,它看起来是一样的,但是由于某种原因,当我在testL上使用testL时,它缺少一个“值”:,但是正如您所看到的,使用相同的toJSON(tmp)是很好的,请参见下面
> toJSON(testL)
{"data":[{"timestamp":"2015-07-22T02:00:00","PM2.5":25.48},{"timestamp":"2015-07-22T03:00:00","PM2.5":25.09},{"timestamp":"2015-07-22T04:00:00","PM2.5":26.26}]}
>
> toJSON(tmp)
{"data":[{"timestamp":"2015-07-22T02:00:00","value":{"PM2.5":25.48}},{"timestamp":"2015-07-22T03:00:00","value":{"PM2.5":25.09}},{"timestamp":"2015-07-22T04:00:00","value":{"PM2.5":26.26}}]} 原因可能如下:当我卸载tmp和testL时,我观察到unlist(tmp)是“data.value e.PM2.51”,unlist(testL)是data.PM2.51
> unlist(tmp)
data.timestamp1 data.timestamp2 data.timestamp3
"2015-07-22T02:00:00" "2015-07-22T03:00:00" "2015-07-22T04:00:00"
data.value.PM2.51 data.value.PM2.52 data.value.PM2.53
"25.48" "25.09" "26.26"
> unlist(testL)
data.timestamp1 data.timestamp2 data.timestamp3
"2015-07-22T02:00:00" "2015-07-22T03:00:00" "2015-07-22T04:00:00"
data.PM2.51 data.PM2.52 data.PM2.53
"25.48" "25.09" "26.26"
> 那么,如何才能获得与toJSON(tmp)完全相同的JSON文件呢?
提前感谢!詹姆斯
发布于 2015-08-27 10:29:59
使用jsonlite包,我获得了和您一样的信息。如果您仔细观察使用dput的结构,您将看到tmp和testL看起来是一样的,而它们并不相同。
> dput(tmp)
structure(list(data = structure(list(timestamp = c("2015-07-22T02:00:00",
"2015-07-22T03:00:00", "2015-07-22T04:00:00"), value = structure(list(
PM2.5 = c(25.48, 25.09, 26.26)), .Names = "PM2.5", class = "data.frame", row.names = c(NA,
3L))), .Names = c("timestamp", "value"), class = "data.frame", row.names = c(NA,
3L))), .Names = "data")
> dput(testL)
structure(list(data = structure(list(timestamp = c("2015-07-22T02:00:00",
"2015-07-22T03:00:00", "2015-07-22T04:00:00"), PM2.5 = c(25.48,
25.09, 26.26)), .Names = c("timestamp", "PM2.5"), row.names = c(NA,
-3L), class = "data.frame")), .Names = "data")在Rstudio中,查看此结构的一种更方便的方法是查看环境面板。简而言之,tmp是一个包含data的列表。data是一个包含timestamp和值的data.frame。value是一个包含PM.2.5的data.frame。
您可以使用以下方法更正testL的结构
testL$data$value <- data.frame(PM2.5=testL$data$PM2.5)
testL$data$PM2.5 <- NULL然后,jsonlite::toJSON为tmp和testL生成相同的结果。
编辑:为了子孙后代,请注意,您确实应该使用str而不是dput来进行这种调试!
例如,下面是str(tmp)的样子:
List of 1
$ data:'data.frame': 3 obs. of 2 variables:
..$ timestamp: chr [1:3] "2015-07-22T02:00:00" "2015-07-22T03:00:00" "2015-07-22T04:00:00"
..$ value :'data.frame': 3 obs. of 1 variable:
.. ..$ PM2.5: num [1:3] 25.5 25.1 26.3这比dput的输出要容易得多。
https://stackoverflow.com/questions/32246586
复制相似问题