2017-07-17 37 views
0

我使用OpenCPU和R創建一個Web API,它接受一些輸入並從數據庫中返回一個topoJSON文件以及一些其他信息。 OpenCPU會自動將輸出推送到JSON,這會導致引用了JSON的JSON輸出(即topoJSON)。這顯然不是理想的 - 特別是因爲它後來引起令人難以置信的混亂的引號(\「)。我嘗試使用fromJSON將其轉換爲R對象,然後可以將其轉換回來(這非常低效),但它返回一個稍微不同的語法和結果是,它不起作用如何在R中引用JSON字符串以保持JSON?

我覺得應該有一些方法來將字符串轉換爲其他類型的對象,導致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(所以不能使用其他函數,不幸的是),我不能做任何後處理。

回答

1

看來你只是想要的價值,而不是向量。設置auto_unbox=TRUE把長一個向量轉換爲標值

toJSON(fromJSON(s), auto_unbox = TRUE) 
# {"type":"Topology","objects":{"map":"0"}} 

這確實不打印(使用jsonlite_1.5)對我逃跑。也許你正在使用舊版本的jsonlite。您也可以使用cat()來打印結果。當你這樣做時你不會看到斜槓。

cat(toJSON(fromJSON(s), auto_unbox = TRUE)) 
+0

對不起,應該澄清是什麼OpenCPU,因爲它似乎並沒有使用那麼多(雖然這是非常有用)。基本上,它的工作方式是創建一個R函數並能夠將其用作Web API服務。它將返回JSON,它使用jsonlite自動轉換。有一些煩人的限制,就像你不能只是讓它返回你想要的任何字符串。如果我可以只是返回一個字符串,這不會是一個問題 - 我可以只在開始和結束標記。不幸的是,它不會那樣工作。 – Phil

+0

然後我建議你編輯你的問題來更清楚地展示問題。 – MrFlick

1

您可以手動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"}}