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

Ric*_*ven 20 json r rjsonio

我有以下double值向量x,其中每个元素代表一个POSIX日期时间

x <- c(1417621083, 1417621204, 1417621384, 1417621564, 1417621623)
Run Code Online (Sandbox Code Playgroud)

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

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

dates <- c("/new Date(1417621083)", "/Date(1417621204)", "/Date(1417621384)", 
           "/Date(1417621564)", "/Date(1417621623)")
Run Code Online (Sandbox Code Playgroud)

当我dates通过RJSONIO解析器运行第二个任意向量时,一切似乎都很顺利.

library(RJSONIO)
make <- toJSON(list(date = dates, value = LETTERS))
Run Code Online (Sandbox Code Playgroud)

然后,当我使用stringFun带有日期的R-json C例程的选项解析新的JSON文本时,结果是一个双元素列表,第一个元素是列表,第二个元素是原子向量.

(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"
Run Code Online (Sandbox Code Playgroud)

但我期待着两个载体的列表,我宁愿以它的形式出现

# $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"
Run Code Online (Sandbox Code Playgroud)

我尝试了几种方法来简化调用中的结果fromJSON(),但没有一种方法可以工作.以下是我的一些尝试:

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

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"
Run Code Online (Sandbox Code Playgroud)

尝试这个 simplify 论点:我尝试过几种不同的变种而且都没有效果.

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"
Run Code Online (Sandbox Code Playgroud)

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

ags*_*udy 5

我认为你无法在同一时间内将日期和它们的简化强制转换为向量.原因很简单,这还没有实现RJSONIO.实际上,正如您所提到的,简化是使用一个标志:StrictLogical,StrictNumericStrictCharacter创建逻辑,数字或字符向量.也许你应该联系维护者来添加日期StrictPosixct标志POSIXct.

使用stringFun无助,因为它接收标量元素(字符串)并且不知道其他向量元素.您可以通过将R函数定义为stringFun参数并将浏览器置于其中来进行检查.

convertJSONDate <-
  function(x)
  {
     if(grepl('Date',x)){
       val <- sub('.*[(]([0-9]+).*','\\1',x)
       return(structure(as.numeric(val)/1000, class = c("POSIXct", "POSIXt")))
     }
     x
   }
Run Code Online (Sandbox Code Playgroud)

我猜你想在解析你的json时出于性能原因而进行强制/简化.我会使用不同的策略:

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

这里有一些代码可以显示:

## 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"
Run Code Online (Sandbox Code Playgroud)