5

我需要使用以下格式的管道工包从 R 发送响应

{
  "status": "SUCCESS",
  "code": "200",
  "output": {
    "studentid": "1001",
    "name": "Kevin"
  }
}

但我得到以下格式

[
  "{\n  \"status\": \"SUCCESS\",\n  \"code\": \"200\",\n  \"output\": {\n    \"studentid\": \"1001\",\n    \"name\": \"Kevin\"\n  }\n}"
]

请帮我正确格式化这个json

我的代码

#* @post /sum
addTwo <- function(){
  library(jsonlite)
  x <- list(status = "SUCCESS", code = "200",output = list(studentid = "1001", name = "Kevin"))
  output<-toJSON(x,pretty = TRUE, auto_unbox = TRUE)
  return (output)
}
4

2 回答 2

9

unboxedJSON在管道工的开发版本中添加了一个序列化程序。根据将来何时读取该序列化程序,该序列化程序可能已发布到 CRAN,甚至可能是现在的默认序列化程序(我仍在争论)。

但现在,您可以从 GitHub ( devtools::install_github("trestletech/plumber")) 安装开发版本,然后将@serializer unboxedJSON注释添加到您的函数中,如下所示:

#* @post /sum
#* @serializer unboxedJSON
addTwo <- function(){
  list(status = "SUCCESS", code = "200",output = list(studentid = "1001", name = "Kevin"))

}

仅供参考,如果您确实想强制管道工返回您直接提供的一些文本,您应该能够$body在 res 上设置元素,然后res从函数中返回对象。

#* @get /
function(res){
  res$body <- "I am raw"
  res
}

I am raw这将在其响应中返回未格式化的、未序列化的文本。

于 2017-05-21T02:29:38.200 回答
1

只需删除 toJSON() 包装器。Plumber 已经做了 JSON 序列化,所以你通过添加一个 toJSON 函数来做两次。

这应该有效。

 addTwo <- function(){
  x <- list(status = "SUCCESS", code = "200",output = list(studentid = "1001", name = "Kevin"))
  return (x)
}
于 2017-07-09T11:37:04.253 回答