如何消除jsonlite生成的JSON字符串中的转义斜杠?
解决jsonlite转JSON后环境面板及Plumber部署出现转义斜杠的问题
问题根源
jsonlite::toJSON()返回的是json类对象,控制台的print()方法会自动美化输出,隐藏转义字符;但环境面板显示的是该对象的原始字符串表示,因此会出现转义斜杠\。- Plumber的
@serializer json会对函数返回值执行JSON序列化操作,如果返回的是已经序列化完成的JSON字符串(比如myvar),就会被二次序列化,导致转义斜杠保留在最终输出中。
解决方案
方案1:让Plumber直接序列化原始DataFrame(推荐)
无需提前将DataFrame转为JSON,直接返回原始DataFrame,利用Plumber的@serializer json自动完成序列化,避免重复操作:
library(plumber) library(dplyr) library(jsonlite) # 定义原始DataFrame df <- data.frame ( Training = c("Strength", "Stamina", "Other"), Pulse = c(100, 150, 120), Duration = c(60, 30, 45) ) #* @param symbol Ticker symbol (just to input something in the function) #* @get /return #* @serializer json financial_data <- function(symbol) { df # 返回原始DataFrame,由Plumber自动序列化 }
方案2:提前生成JSON字符串,避免Plumber二次序列化
如果必须提前生成JSON字符串,先将json类对象转为普通字符,再用@serializer text直接返回文本内容:
library(plumber) library(dplyr) library(jsonlite) df <- data.frame ( Training = c("Strength", "Stamina", "Other"), Pulse = c(100, 150, 120), Duration = c(60, 30, 45) ) # 将json对象转为普通字符串 myvar <<- as.character(toJSON(df, pretty=FALSE)) #* @param symbol Ticker symbol (just to input something in the function) #* @get /return #* @serializer text financial_data <- function(symbol) { myvar }
或者手动设置响应头,直接返回JSON文本:
library(plumber) library(dplyr) library(jsonlite) df <- data.frame ( Training = c("Strength", "Stamina", "Other"), Pulse = c(100, 150, 120), Duration = c(60, 30, 45) ) myvar <<- toJSON(df, pretty=FALSE) #* @param symbol Ticker symbol (just to input something in the function) #* @get /return financial_data <- function(symbol, res) { res$setHeader("Content-Type", "application/json") as.character(myvar) }
内容的提问来源于stack exchange,提问作者user2165379
相关产品推荐
相关产品推荐

