gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:18:42 27 4
gpt4 key购买 nike

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

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

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

作为练习,我想将这些值转换为JSON文本,然后再次将它们读回R,但是在将日期时间表示形式转换为漂亮的简化列表结果时遇到了麻烦。在JSON中,日期必须采用特殊格式,因此 x中的值将转换为以下格式:
dates <- c("/new Date(1417621083)", "/Date(1417621204)", "/Date(1417621384)", 
"/Date(1417621564)", "/Date(1417621623)")

当我通过RJSONIO解析器使用第二个任意 vector 运行 dates时,一切似乎都进行得很顺利。
library(RJSONIO)
make <- toJSON(list(date = dates, value = LETTERS))

然后,当我使用 stringFun选项和R-json C例程解析日期的新JSON文本时,结果是一个包含两个元素的列表,第一个元素是一个列表,第二个元素是一个原子 vector 。
(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"

但是我期望有两个 vector 的列表,而我希望它的形式为
# $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()的调用中的结果,但没有一种有效。这是我的一些尝试:

使用处理程序:这样可以简化结果,但无法重新格式化日期
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 参数:我尝试了几种不同的方法,但都没有奏效。
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()调用中日期的结果?

最佳答案

我认为您无法同时获得日期的强制性和它们对 vector 的简化。出于简单原因,尚未在RJSONIO中实现。确实,正如您提到的,简化是通过使用以下标志之一完成的:StrictLogicalStrictNumericStrictCharacter创建逻辑,数字或字符 vector 。也许您应该与维护人员联系以添加StrictPosixct标志以获取POSIXct日期。

使用stringFun无济于事,因为它接收到标量元素(字符串)并且不知道其他 vector 元素。您可以通过将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
}

我想出于性能原因,当您解析json时,您想进行强制/简化。我会使用不同的策略:
  • 我将数字值强制转换为POSIXct,并将它们作为字符存储在格式正确的日期中。这比特殊的(丑陋的)“new Date(..,date“)RJSONIO日期格式要好。请记住,json格式是一种标准格式,可以由其他语言(python,js等)进行解析。
  • 然后将日期解析为正常字符,然后使用快速fasttime包将其强制转换为POSIXct vector 。

  • 这里有一些代码来显示这一点:
    ## 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"

    关于json - 使用RJSONIO::fromJSON()简化POSIX节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27307288/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com