Как я могу запретить toJSON цитировать мою строку JSON в R?

Я использую OpenCPU и R для создания веб-API, который принимает некоторые входные данные и возвращает файл topoJSON из базы данных, а также некоторую другую информацию. 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 (поэтому, к сожалению, никакая другая функция не может быть использована), и я не могу выполнять какую-либо постобработку.


person Phil    schedule 17.07.2017    source источник


Ответы (2)


Кажется, вам просто нужны значения, а не векторы. Установите 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))
person MrFlick    schedule 17.07.2017
comment
Извините, нужно было уточнить, что такое OpenCPU, так как он, похоже, не так часто используется (хотя и весьма полезен). По сути, это работает так: вы создаете функцию R и можете использовать ее как службу веб-API. Он вернет JSON, который автоматически преобразуется с помощью jsonlite. Есть некоторые раздражающие ограничения, например, вы не можете просто вернуть любую строку, которую хотите. Если бы я мог просто вернуть строку, это не было бы проблемой — я мог бы просто поставить маркеры в начале и в конце. К сожалению, это так не работает. - person Phil; 18.07.2017
comment
Тогда я предлагаю вам отредактировать свой вопрос, чтобы более четко продемонстрировать проблему. - person MrFlick; 18.07.2017

Вы можете вручную 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"}} 
person Ralf Stubner    schedule 10.08.2017