Чтение неэкранированных обратных косых черт в 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. Но, скорее всего, вы не получаете его правильно.