gpt4 book ai didi

json - 写入/读取递归结构 S4 对象

转载 作者:行者123 更新时间:2023-12-02 09:28:14 27 4
gpt4 key购买 nike

我有一个 S4 对象的递归结构,可以通过这两个类来呈现(这是一个简单的版本):

cl2 <-
setClass("cl2",
representation(
id = "numeric",
date="Date"),
prototype = list(
date=Sys.Date(),
id=sample(1:100,1)
)
)


cl1 <-
setClass("cl1",
representation(
date="Date",
cl2 = "cl2"
),
prototype = list(
date=Sys.Date()
)

)

我想保存/加载 cl1 类型的对象。我选择使用 json 格式(适合非结构化对象)。问题出在日期上。日期被强制转换为数字? 当我序列化对象时,是否有一个选项/解决方案可以以正确的格式获取日期?请注意,对象可以包含其他对象(递归结构),所以我希望所有日期都采用良好的格式.

cat(RJSONIO::toJSON(cl1(),pretty=TRUE))
{
"date" : 16861,
"cl2" : {
"id" : 90,
"date" : 16861
}
}

解决方案可以是用字符替换日期。但我将放松 S4 对象的验证机制,我应该对所有对象实现日期验证。预先感谢您的帮助。

预期的输出应该是这样的:

{
"date" :"2016-03-01",
"cl2" : {
"id" : 76,
"date" : "2016-03-01"
}
}

最佳答案

阅读toJSON的文档我发现了一个有趣的参数:

force unclass/skip objects of classes with no defined JSON mapping

所以我尝试了,我认为这符合您的需要,因为您可以简单地忽略类条目:

> s <- jsonlite::toJSON(cl1(),force=TRUE,auto_unbox=TRUE,pretty=TRUE)
> s
{
"date": "2016-03-01",
"cl2": {
"date": "2016-03-01",
"id": 67,
"class": "cl2"
},
"class": "cl1"
}

缺点:这仍然无法使用 fromJSON “按原样”加载到 s4 对象,因为它会返回一个命名列表,递归分析列表以重新创建 S4 对象是可行的,但是您'您必须创建必要的 as 实现来将命名列表转换为您的类,例如:

setAs('list', 'cl2', 
function(from, to) {
new(to, id=from[['id']], date=as.Date(from[['date']]))
})

setAs('list','cl1',
function(from, to) {
new(to,date=as.Date(from[['date']],cl2=as(from[['cl2']],'cl2')))
})

使用先前输出的虚拟输入:

input <- '
{
"date": "2016-03-05",
"cl2": {
"date": "2016-02-01",
"id": 83,
"class": "cl2"
},
"class": "cl1"
}'

这给出:

> as(fromJSON(input),'cl1')
An object of class "cl1"
Slot "date":
[1] "2016-03-05"

Slot "cl2":
An object of class "cl2"
Slot "id":
[1] 67

Slot "date":
[1] "2016-03-01"

我让您根据自己的实际用例进行调整,可能使用 fromJSON(input,FALSE) 来获取“纯”列表以强制使用 lapply 例如,如果您的 json 输入中有多个 cl1 类实例。

关于json - 写入/读取递归结构 S4 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35724644/

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