2017-01-31 5 views
2

Следуя примеру на странице http://plumber.trestletech.com/R сантехник JSON сериализатор auto_unbox

Я написал 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"]} 

Но я хочу, чтобы квадратные скобки были удалены. В простых вызовах JSON это можно сделать, используя auto_unbox = TRUE, но как я могу это сделать в сантехнике. Как написать собственный сериализатор и использовать его в приведенном выше коде?

+0

Было бы проще помочь вам, если вы предоставили [воспроизводимый пример] (http://stackoverflow.com/q/5963269/4303162). Поместите кусок кода, который производит точно результат, который вы уже показываете. В этом примере вы можете выполнить 'toJSON (fromJSON ('{" speech ": [" aa "]," source ": [" bb "]," displayText ": [" cc "]}'), auto_unbox = TRUE) ', чтобы избавиться от квадратных скобок. – Stibu

+0

Добавлен пример – anonR

ответ

5

Я понял процесс добавления пользовательских сериализаторов. Допустим, мы хотим, чтобы сделать пользовательский сериализатор для 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"} 
Смежные вопросы