将 Class 个实例另存为 JSON
Save A Class Instance As JSON
问题
我正在使用 RC 各种定制的 classes 进行项目。我想在我的程序结束时保存某些 class 实例,以便将它们导出到数据库。我尝试使用 jsonlite::toJSON(account)
但我收到了错误消息
Error: No method for S4 class:BankAccount
Class
我有以下class
BankAccount <- setRefClass('BankAccount',
fields = list(
balance = 'numeric',
ledger = 'data.frame'
),
methods = list(
deposit = function (x) {
x <- max(x,0)
balance <<- balance + x
ledger <<- data.frame(
Date = c(ledger$Date, as.character(Sys.time())),
Type = c(ledger$Type, 'Deposit'),
Amount = c(ledger$Amount, x),
stringsAsFactors = FALSE
)
},
withdraw = function (x) {
x <- max(x,0)
balance <<- balance - x
ledger <<- data.frame(
Date = c(ledger$Date, as.character(Sys.time())),
Type = c(ledger$Type, 'Withdrawal'),
Amount = c(ledger$Amount, x),
stringsAsFactors = FALSE
)
}
))
实例
这是 class
的一个实例
account <- BankAccount$new(balance = 100)
account$deposit(1000)
Sys.sleep(5)
account$withdraw(97.89)
account
Reference class object of class "BankAccount"
Field "balance":
[1] 1002.11
Field "ledger":
Date Type Amount
1 2018-12-31 16:21:20 Deposit 1000.00
2 2018-12-31 16:21:26 Withdrawal 97.89
JSON
现在我想将其保存为 JSON 格式的文件(JSON 中可能有错字 - 不太熟悉格式)
{
"balance": "double",
"ledger": {
"Date": "string",
"Type": "string",
"Amount": "double"
}
}
PS
我也试过不使用 ledger
字段(属于 class data.frame
),但还是不行。
编辑
这是jsonlite::serializeJSON(account)
的输出
{"type":"S4","attributes":{".xData":{"type":"environment","attributes":{},"value":{}}},"value":{"class":"BankAccount","package":".GlobalEnv"}}
如您所见,它似乎只保存有关 class BankAccount
的信息,但不保存有关实例 account
的信息(余额值等缺失)。
这是一个解决方法(如@StefanF 所示)。可以将方法添加到 classes
# converts to JSON
toJSON = function (prettifyy = TRUE) {
instanceJSON <- jsonlite::toJSON(list(balance = balance,ledger = ledger))
if (prettifyy) instanceJSON <- jsonlite::prettify(instanceJSON)
instanceJSON
}
# saves as .json, e.g. path = 'C:/Test/instance.json'
saveJSON = function (path) {
instanceJSON <- toJSON()
writeLines(instanceJSON, path)
}
解决方案并不理想,因为
- 需要指定哪些字段应该合并,这需要一些工作
- 此外,如果
BankAccount
的字段是class MyClass
(另一个自定义class),那么您需要指定[=12的哪些字段=] 具有相关性或为 MyClass
创建一个 toJSON
问题
我正在使用 RC 各种定制的 classes 进行项目。我想在我的程序结束时保存某些 class 实例,以便将它们导出到数据库。我尝试使用 jsonlite::toJSON(account)
但我收到了错误消息
Error: No method for S4 class:BankAccount
Class
我有以下class
BankAccount <- setRefClass('BankAccount',
fields = list(
balance = 'numeric',
ledger = 'data.frame'
),
methods = list(
deposit = function (x) {
x <- max(x,0)
balance <<- balance + x
ledger <<- data.frame(
Date = c(ledger$Date, as.character(Sys.time())),
Type = c(ledger$Type, 'Deposit'),
Amount = c(ledger$Amount, x),
stringsAsFactors = FALSE
)
},
withdraw = function (x) {
x <- max(x,0)
balance <<- balance - x
ledger <<- data.frame(
Date = c(ledger$Date, as.character(Sys.time())),
Type = c(ledger$Type, 'Withdrawal'),
Amount = c(ledger$Amount, x),
stringsAsFactors = FALSE
)
}
))
实例
这是 class
的一个实例account <- BankAccount$new(balance = 100)
account$deposit(1000)
Sys.sleep(5)
account$withdraw(97.89)
account
Reference class object of class "BankAccount"
Field "balance":
[1] 1002.11
Field "ledger":
Date Type Amount
1 2018-12-31 16:21:20 Deposit 1000.00
2 2018-12-31 16:21:26 Withdrawal 97.89
JSON
现在我想将其保存为 JSON 格式的文件(JSON 中可能有错字 - 不太熟悉格式)
{
"balance": "double",
"ledger": {
"Date": "string",
"Type": "string",
"Amount": "double"
}
}
PS
我也试过不使用 ledger
字段(属于 class data.frame
),但还是不行。
编辑
这是jsonlite::serializeJSON(account)
{"type":"S4","attributes":{".xData":{"type":"environment","attributes":{},"value":{}}},"value":{"class":"BankAccount","package":".GlobalEnv"}}
如您所见,它似乎只保存有关 class BankAccount
的信息,但不保存有关实例 account
的信息(余额值等缺失)。
这是一个解决方法(如@StefanF 所示)。可以将方法添加到 classes
# converts to JSON
toJSON = function (prettifyy = TRUE) {
instanceJSON <- jsonlite::toJSON(list(balance = balance,ledger = ledger))
if (prettifyy) instanceJSON <- jsonlite::prettify(instanceJSON)
instanceJSON
}
# saves as .json, e.g. path = 'C:/Test/instance.json'
saveJSON = function (path) {
instanceJSON <- toJSON()
writeLines(instanceJSON, path)
}
解决方案并不理想,因为
- 需要指定哪些字段应该合并,这需要一些工作
- 此外,如果
BankAccount
的字段是classMyClass
(另一个自定义class),那么您需要指定[=12的哪些字段=] 具有相关性或为MyClass
创建一个
toJSON