将 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