首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用RJSONIO::fromJSON()简化POSIX节点

用RJSONIO::fromJSON()简化POSIX节点
EN

Stack Overflow用户
提问于 2014-12-05 01:22:26
回答 3查看 498关注 0票数 20

我有以下双值向量,x,其中每个元素表示一个POSIX日期-时间。

代码语言:javascript
复制
x <- c(1417621083, 1417621204, 1417621384, 1417621564, 1417621623)

我正在使用RJSONIO包,并希望继续这样做。

作为练习,我想将这些值转换为JSON文本,然后再将它们读回R,但是在将日期时间表示转换为一个很好的简化列表结果时遇到了困难。在JSON中,日期需要采用特殊格式,因此x中的值转换为以下内容:

代码语言:javascript
复制
dates <- c("/new Date(1417621083)", "/Date(1417621204)", "/Date(1417621384)", 
           "/Date(1417621564)", "/Date(1417621623)")

当我使用第二个任意向量通过RJSONIO解析器运行dates时,一切看起来都很顺利。

代码语言:javascript
复制
library(RJSONIO)
make <- toJSON(list(date = dates, value = LETTERS))

然后,当我使用带有routine例程的stringFun选项解析新的JSON文本时,结果是一个双元素列表,第一个元素是list,第二个元素是原子向量。

代码语言:javascript
复制
(read <- fromJSON(make, stringFun = "R_json_dateStringOp"))
# $date
# $date[[1]]
# [1] "2014-12-03 07:38:03 PST"
# 
# $date[[2]]
# [1] "2014-12-03 07:40:04 PST"
# 
# $date[[3]]
# [1] "2014-12-03 07:43:04 PST"
# 
# $date[[4]]
# [1] "2014-12-03 07:46:04 PST"
# 
# $date[[5]]
# [1] "2014-12-03 07:47:03 PST"
# 
# 
# $value
# [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M"
# [14] "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"

但是我希望有一个由两个向量组成的列表,我更希望它以

代码语言:javascript
复制
# $date
# [1] "2014-12-03 07:38:03 PST" "2014-12-03 07:40:04 PST"
# [3] "2014-12-03 07:43:04 PST" "2014-12-03 07:46:04 PST"
# [5] "2014-12-03 07:47:03 PST"
# 
# $value
# [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q"
# [18] "R" "S" "T" "U" "V" "W" "X" "Y" "Z"

我尝试了几种方法来简化fromJSON()调用中的结果,但这些方法都没有奏效。以下是我的几次尝试:

使用处理程序的 :,这简化了结果,但未能重新格式化日期

代码语言:javascript
复制
h1 <- basicJSONHandler(simplify = TRUE)
fromJSON(make, handler = h1, stringFun = "R_json_dateStringOp")
# $date
# [1] "/new Date(1417621083)" "/Date(1417621204)"    
# [3] "/Date(1417621384)"     "/Date(1417621564)"    
# [5] "/Date(1417621623)"    
# 
# $value
# [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M"
# [14] "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"

尝试了 simplify 的论点: --我尝试了几种不同的方法,但都没有效果。

代码语言:javascript
复制
fromJSON(make, simplify = StrictCharacter)
# $date
# [1] "/new Date(1417621083)" "/Date(1417621204)"    
# [3] "/Date(1417621384)"     "/Date(1417621564)"    
# [5] "/Date(1417621623)"    
#
# $value
#  [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M"
# [14] "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"

有没有办法简化调用fromJSON()中日期的结果?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-16 09:15:04

我认为你不可能同时把日期的强制和简化变成一个向量。原因很简单,这还没有在RJSONIO中实现。事实上,正如您提到的,简化使用了一个标志:StrictLogicalStrictNumericStrictCharacter,它们创建了逻辑、数字或字符向量。也许您应该与维护人员联系,为POSIXct日期添加POSIXct标志。

使用stringFun是没有帮助的,因为它接收到一个标量元素(一个字符串),并且它不知道其他的向量元素。您可以通过将R函数定义为stringFun参数来检查这一点,并在其中放置浏览器。

代码语言:javascript
复制
convertJSONDate <-
  function(x)
  {
     if(grepl('Date',x)){
       val <- sub('.*[(]([0-9]+).*','\\1',x)
       return(structure(as.numeric(val)/1000, class = c("POSIXct", "POSIXt")))
     }
     x
   }

我想,当您出于性能原因解析json时,您希望进行强制/简化。我会用另一种策略:

  1. 我强迫我的数字值到一个POSIXct,我将把它们作为一个字符存储在一个格式良好的日期。这比特殊的(丑陋的)“新日期(.,日期”) RJSONIO日期格式更好。记住,json格式是其他语言可以解析的标准格式( python,js,..)
  2. 然后将我的日期解析为普通字符,并使用快速fasttime包将其强制转换为POSIXct向量。

这里有一些代码来说明这一点:

代码语言:javascript
复制
## coerce x to dates a well formatted dates
dd <- as.character(as.POSIXct(x,origin = '1970-01-01' , tz = "UTC"))
## read it again in a fast way
fastPOSIXct(fromJSON(make)$date)

[1] "2014-12-03 16:38:03 CET" "2014-12-03 16:40:04 CET" "2014-12-03 16:43:04 CET" "2014-12-03 16:46:04 CET" "2014-12-03 16:47:03 CET"
票数 5
EN

Stack Overflow用户

发布于 2014-12-05 01:56:18

read值(我猜这是想要的起点).这是一种方法:

代码语言:javascript
复制
> dd <- sapply(read, c) 
> class(dd) <- "POSIXct"
> dd
[1] "2014-12-03 07:38:03 PST" "2014-12-03 07:40:04 PST" "2014-12-03 07:43:04 PST"
[4] "2014-12-03 07:46:04 PST" "2014-12-03 07:47:03 PST"

类强制有点“肮脏”,但我已经尝试过很多其他(失败的)策略,比如unlistsapply( read,"[[",1)sapply(read, c) ),以保存属性,所以我决定用R来下注,并挥动类锤。

票数 3
EN

Stack Overflow用户

发布于 2014-12-07 01:59:29

由于赏金已经过期,而且目前无法在RJSONIO中完成(或者看起来是这样),我将把它作为另一种替代方法,以防其他用户遇到这个问题并需要一个解决方案。

jsonlite可以很容易地完成这个操作。我们所要做的就是将POSIXt类添加到数值向量中,并在非导出函数asJSON中为解析器指定"mongo"

代码语言:javascript
复制
# unloadNamespace(RJSONIO)  ## to avoid confusion between packages
library(jsonlite)    

x <- c(1417621083, 1417621204, 1417621384, 1417621564, 1417621623)

class(x) <- "POSIXt"    

data <- list(dates = x, values = letters[1:5])

json <- jsonlite:::asJSON(data, POSIXt = "mongo")

fromJSON(json)
# $dates
# [1] "2014-12-03 07:38:03 PST" "2014-12-03 07:40:04 PST"
# [3] "2014-12-03 07:43:04 PST" "2014-12-03 07:46:04 PST"
# [5] "2014-12-03 07:47:03 PST"
# 
# $values
# [1] "a" "b" "c" "d" "e"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27307288

复制
相关文章

相似问题

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