首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数据到JSON问题

从数据到JSON问题
EN

Stack Overflow用户
提问于 2015-08-27 10:12:08
回答 1查看 74关注 0票数 0

我有如下所示的数据

代码语言:javascript
复制
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格式如下所示。

代码语言:javascript
复制
{
  "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是怎样的

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

代码语言:javascript
复制
> 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)是很好的,请参见下面

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

代码语言:javascript
复制
> 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文件呢?

提前感谢!詹姆斯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-27 10:29:59

使用jsonlite包,我获得了和您一样的信息。如果您仔细观察使用dput的结构,您将看到tmp和testL看起来是一样的,而它们并不相同。

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

代码语言:javascript
复制
testL$data$value <- data.frame(PM2.5=testL$data$PM2.5)
testL$data$PM2.5 <- NULL

然后,jsonlite::toJSON为tmp和testL生成相同的结果。

编辑:为了子孙后代,请注意,您确实应该使用str而不是dput来进行这种调试!

例如,下面是str(tmp)的样子:

代码语言:javascript
复制
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的输出要容易得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32246586

复制
相关文章

相似问题

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