Чтение неэкранированных обратных косых черт в JSON в R

Я пытаюсь прочитать некоторые данные из Facebook Graph API Explorer в R, чтобы сделать анализ текста. Тем не менее, похоже, что в фиде JSON есть обратные слэши без экранирования, что приводит к блокировке rjson. Ниже приведен минимальный пример того вида ввода, который вызывает проблемы.

library(rjson)
txt <- '{"data":[{"id":2, "value":"I want to \\"post\\" a picture\\video"}]}'
fromJSON(txt)

(Обратите внимание, что двойная обратная косая черта в \\" а также \\video после синтаксического анализа преобразуется в одиночные обратные слэши, что и есть в моих реальных данных.)

Я также попробовал пакет RJSONIO, который также выдавал ошибки, и даже иногда приводил к сбою R.

Кто-нибудь сталкивался с этой проблемой раньше? Есть ли способ исправить это, если не искать вручную каждую возникающую ошибку? Возможно, JSON анализируется в мегабайтах, и сообщения об ошибках не очень информативны относительно того, где именно находится проблемный ввод.

2 ответа

Просто замените обратную косую черту, которая не экранирует двойные кавычки, табуляции или переводы строк, двойной обратной косой чертой.

В регулярном выражении '\\\\' преобразуется в одну обратную косую черту (необходимы два уровня экранирования, один для R, другой для механизма регулярных выражений). Нам нужен движок Perl Regex, чтобы использовать lookahead.

library(stringr)
txt2 <- str_replace_all(txt, perl('\\\\(?![tn"])'), '\\\\\\\\')
fromJSON(txt2)

Проблема в том, что вы пытаетесь разобрать неверный JSON:

library(jsonlite)
txt <- '{"data":[{"id":2, "value":"I want to \\"post\\" a picture\\video"}]}'
validate(txt)

Проблема заключается в picture\\video часть, потому что \v не является допустимой escape-последовательностью JSON, даже если это допустимая escape-последовательность в R и некоторых других языках. Возможно, вы имеете в виду:

library(jsonlite)
txt <- '{"data":[{"id":2, "value":"I want to \\"post\\" a picture\\/video"}]}'
validate(txt)
fromJSON(txt)

В любом случае проблема заключается в источнике данных JSON, который генерирует недопустимый JSON. Если эти данные действительно поступают из Facebook, вы обнаружили ошибку в их API. Но, скорее всего, вы не получаете его правильно.

Другие вопросы по тегам