2013-11-19 4 views
0

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

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

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

Я также попробовал пакет RJSONIO, который также дал ошибки, и даже рухнул R в разы.

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

ответ

0

Просто замените обратные косые черты , которые не избегают двойных кавычек, вкладок или символов новой строки с двойной обратной косой чертой.

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

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

Спасибо. Это не работает, потому что есть символы, такие как '\ '', чтобы обозначить экранированные кавычки. IOW, иногда обратные косые черты корректны, а иногда их нужно модифицировать. –

+0

Я изменил свой пример, чтобы уточнить. –

+0

@HongOoi OK, я обновил свой ответ. Лучшее решение зависит от того, насколько последовательно ошибается JSON. Если они случайные одиночные или двойные blakslashes, вам, вероятно, потребуется сделать некоторые исправления вручную. –

0

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

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

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

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

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

Смежные вопросы