Почему возникает лексическая ошибка: недопустимый символ в тексте json, когда json_string отправляется через curl, но не в консоли R?

#r #json #curl #plumber

#r #json #curl #водопроводчик

Вопрос:

Я использовал Plumber (https://github.com/trestletech/plumber ) создать веб-API для исходного кода R, целью которого является обработка json_string в качестве входных данных и преобразование его в R dataframe.

R-код:

 #* @param data
#* @post /predict
jsonToDF <- function(data) {
    library(jsonlite)
    dat <- fromJSON(data)
}
  

Как вы можете видеть из приведенного выше кода, я использую библиотеку jsonlite и fromJSON() метод.

Затем я предоставил сервис локально через:

 library(plumber) 
r <- plumb("code.R")
r$run(port=54321)
  

Я использовал запрос curl:

 curl -v -i -X POST -H "Content-Type: application/json" --data "testData='{"a":"b"}'" http://localhost:54321/predict 
  

чтобы отправить json_string ( {"a":"b"} ), но это ошибка, которую я получил:

 <simpleError: lexical error: invalid char in json text.
                                       '{"a":"b"}'
                     (right here) ------^
  

Я использовал R console для двойной проверки правильности ввода, и я не получил то же сообщение об ошибке.

 > z <- fromJSON('{"a":"b"}')
> z
$a
[1] "b"
  

Кто-нибудь может объяснить мне, почему это работает в консоли R, но не в качестве входных данных в поле данных запросов curl? Большое вам спасибо!

Комментарии:

1. Пожалуйста, добавьте свой код R, сообщение об ошибке и вывод на консоль в виде текста . помните, что после добавления вы можете отформатировать его, добавив 4 пробела перед каждой строкой или нажав Control K

2. @Julio Я внес необходимые изменения, спасибо за ваши предложения. Надеюсь, теперь проблема прояснилась.

3. Почему у вас есть testData= часть в ваших данных? Похоже, что на это имя нигде нет ссылок.

4. @MrFlick ах, спасибо, что указали на это, это была просто оплошность с моей стороны при копировании кода в процессе разработки этого вопроса

Ответ №1:

Мне удалось получить желаемый ввод, изменив "data='{"a":"b"}'" на "data={"a":"b"}" . Я просто удалил одинарные кавычки из поля —data команды curl .

Я думаю, что R автоматически обрабатывается {"a":"b"} как строка после получения ее от curl, поэтому мне не нужно было явно объявлять ее как '{"a":"b"}' при отправке через curl.