>我正在使用OpenCPU和R创建一个Web API,该API接收一些输入并从数据库返回拓扑JSON文件以及其他一些信息。OpenCPU 会自动通过 toJSON 推送输出,从而产生引用 JSON 的 JSON 输出(即 topoJSON(。这显然并不理想 - 特别是因为它随后会变得非常混乱,带有反引号(\"(。我尝试使用 fromJSON 将其转换为 R 对象,然后可以转换回来(效率非常低(,但它返回的语法略有不同,结果是它不起作用。
我觉得应该有某种方法可以将字符串转换为其他类型的对象,从而导致 toJSON 调用不同的处理程序,告诉它不要管它,但我无法弄清楚如何做到这一点。
> s <- '{"type":"Topology","objects":{"map": "0"}}'
> fromJSON(s)
$type
[1] "Topology"
$objects
$objects$map
[1] "0"
> toJSON(fromJSON(s))
{"type":["Topology"],"objects":{"map":["0"]}}
这只是文件的开头(我用"0"替换了实际地图(,如您所见,"拓扑"和"0"周围出现了括号。或者,如果我只是将其保留为字符串,我最终会得到这个混乱:
> toJSON(s)
["{"type":"Topology","objects":{"0000595ab81ec4f34__csv": "0"}}"]
有没有办法解决这个问题,以便我只得到逐字字符串但没有引号和反引号?
编辑:请注意,因为我使用的是OpenCPU,所以输出需要来自toJSON(所以不幸的是,没有其他函数可以使用(,我不能做任何后处理。
似乎你只想要值而不是向量。设置auto_unbox=TRUE
以将长度 1 向量转换为标量值
toJSON(fromJSON(s), auto_unbox = TRUE)
# {"type":"Topology","objects":{"map":"0"}}
这确实打印而不会为我逃脱(使用jsonlite_1.5
(。也许您使用的是旧版本的jsonlite
。您还可以通过使用cat()
打印结果来解决此问题。执行此操作时,您不会看到斜杠。
cat(toJSON(fromJSON(s), auto_unbox = TRUE))
您可以手动unbox
相关条目:
library(jsonlite)
s <- '{"type":"Topology","objects":{"map": "0"}}'
j <- fromJSON(s)
j$type <- unbox(j$type)
j$objects$map <- unbox(j$objects$map)
toJSON(j)
# {"type":"Topology","objects":{"map":"0"}}