3

按照页面http://plumber.trestletech.com/上的示例

我把 myfile.R 写成

#* @post /test
test <- function(){
list(speech='aa',source='bb',displayText='cc')
}

我在上面运行了管道工代码,将 int 转换为 API

library(plumber)
r <- plumb("~/Work/myfile.R")
r$run(port=8000)

现在,当我对其执行 POST 请求时,我得到了

curl -XPOST 'localhost:8000/test
-> {"speech":["aa"],"source":["bb"],"displayText":["cc"]}

但我希望删除方括号。在简单的 toJSON 调用中,它可以使用 auto_unbox=TRUE 来完成,但我怎样才能在管道工中做到这一点。如何编写自定义序列化程序并在上面的代码中使用它?

4

2 回答 2

8

我想出了添加自定义序列化程序的过程。假设我们要为 JSON 制作一个自定义序列化程序并将其命名为“custom_json” myfile.R 将是

#* @serializer custom_json
#* @post /test
test <- function(){
list(speech='aa',source='bb',displayText='cc')
}

在运行管道工代码时,它会像

library(plumber)
library(jsonlite)

custom_json <- function(){
  function(val, req, res, errorHandler){
    tryCatch({
      json <- jsonlite::toJSON(val,auto_unbox=TRUE)

      res$setHeader("Content-Type", "application/json")
      res$body <- json

      return(res$toResponse())
    }, error=function(e){
      errorHandler(req, res, e)
    })
  }
}

addSerializer("custom_json",custom_json)
r <- plumb("~/Work/myfile.R")
r$run(port=8000)

现在,当我对其执行 POST 请求时,我得到了

curl -XPOST 'localhost:8000/test
-> {"speech":"aa","source":"bb","displayText":"cc"}
于 2017-02-01T08:23:15.677 回答
3

Plumber 提供了许多开箱即用的序列化程序。unboxedJSON其中之一

只需@serializer unboxedJSON在您的端点上使用注释。

您还可以将默认序列化程序设置为plumber::serializer_unboxed_json.

于 2017-10-23T00:17:55.030 回答