Ошибка анализа JSON-файла с помощью пакета jsonlite

Я пытаюсь прочитать JSON-файл в R, но я получил эту ошибку:

Error in parseJSON(txt) : parse error: trailing garbage [ 33.816101, -117.979401 ] } { "a": "Mozilla\/4.0 (compatibl (right here) ------^ 

Я загрузил файл с http://1usagov.measuredvoice.com/ и разархивировал его с помощью 7zip, затем я использовал следующий код в R:

 library(jsonlite) jsonData <- fromJSON("usagov_bitly_data2013-05-17-1368832207") 

Я не уверен, почему эта ошибка происходит, я искал в Google, но нет никакой информации, кто-то, кто мог бы мне помочь? Это проблема с файлом или мой код?

ДРУГОЕ ОБНОВЛЕНИЕ

Вы можете использовать пакет ndjson для обработки данных ndjson / streaming JSON. Это быстрее, чем jsonlite::stream_in() и всегда создает полностью «плоский» кадр данных:

 system.time(bitly01 <- ndjson::stream_in("usagov_bitly_data2013-05-17-1368832207.gz")) ## user system elapsed ## 0.146 0.004 0.154 system.time(bitly02 <- jsonlite::stream_in(file("usagov_bitly_data2013-05-17-1368832207.gz"), verbose=FALSE, pagesize=10000)) ## user system elapsed ## 0.419 0.008 0.427 

Если мы рассмотрим результирующий ndjson , вы увидите, что ndjson расширяет ll до ll.0 и ll.1 где вы получаете столбец list jsonlite которым вам приходится иметь дело позже.

ndjson :

 dplyr::glimpse(bitly01) ## Observations: 3,959 ## Variables: 19 ## $ a  "Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; HTC_PN071 Build/JZO54K) AppleWebKit/534.30 ... ## $ al  "en-US", "en-us", "en-US,en;q=0.5", "en-US", "en", "en-US", "en-US,en;q=0.5", "en-us", "e... ## $ c  "US", NA, "US", "US", NA, "US", "US", NA, "AU", NA, "US", "US", "US", "US", "US", "US", "... ## $ cy  "Anaheim", NA, "Fort Huachuca", "Houston", NA, "Mishawaka", "Hammond", NA, "Sydney", NA, ... ## $ g  "15r91", "ifIpBW", "10DaxOu", "TysVFU", "10IGW7m", "13GrCeP", "YmtpnZ", "13oM0hV", "15r91... ## $ gr  "CA", NA, "AZ", "TX", NA, "IN", "WI", NA, "02", NA, "OH", "MD", "KY", "OR", "IL", "TX", "... ## $ h  "10OBm3W", "ifIpBW", "10DaxOt", "TChsoQ", "10IGW7l", "13GrCeP", "YmtpnZ", "15PUeH0", "10O... ## $ hc  1365701422, 1302189369, 1368814585, 1354719206, 1368738258, 1368130510, 1363711958, 13687... ## $ hh  "j.mp", "1.usa.gov", "1.usa.gov", "1.usa.gov", "1.usa.gov", "1.usa.gov", "1.usa.gov", "go... ## $ l  "pontifier", "bitly", "jaxstrong", "o_5004fs3lvd", "peacecorps", "bitly", "bitly", "nasat... ## $ ll.0  33.8161, NA, 31.5273, 29.7633, NA, 41.6123, 45.0070, NA, -33.8615, NA, 39.5151, 39.1317, ... ## $ ll.1  -117.9794, NA, -110.3607, -95.3633, NA, -86.1381, -92.4591, NA, 151.2055, NA, -84.3983, -... ## $ nk  0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,... ## $ r  "direct", "http://www.usa.gov/", "http://www.facebook.com/l.php?u=http%3A%2F%2F1.usa.gov%... ## $ t  1368832205, 1368832207, 1368832209, 1368832209, 1368832208, 1368832209, 1368832210, 13688... ## $ tz  "America/Los_Angeles", "", "America/Phoenix", "America/Chicago", "", "America/Indianapoli... ## $ u  "http://www.nsa.gov/", "http://answers.usa.gov/system/selfservice.controller?CONFIGURATIO... ## $ _heartbeat_  NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N... ## $ kw  NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N... 

jsonlite :

 dplyr::glimpse(bitly02) ## Observations: 3,959 ## Variables: 18 ## $ a  "Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; HTC_PN071 Build/JZO54K) AppleWebKit/534.30 ... ## $ c  "US", NA, "US", "US", NA, "US", "US", NA, "AU", NA, "US", "US", "US", "US", "US", "US", "... ## $ nk  0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,... ## $ tz  "America/Los_Angeles", "", "America/Phoenix", "America/Chicago", "", "America/Indianapoli... ## $ gr  "CA", NA, "AZ", "TX", NA, "IN", "WI", NA, "02", NA, "OH", "MD", "KY", "OR", "IL", "TX", "... ## $ g  "15r91", "ifIpBW", "10DaxOu", "TysVFU", "10IGW7m", "13GrCeP", "YmtpnZ", "13oM0hV", "15r91... ## $ h  "10OBm3W", "ifIpBW", "10DaxOt", "TChsoQ", "10IGW7l", "13GrCeP", "YmtpnZ", "15PUeH0", "10O... ## $ l  "pontifier", "bitly", "jaxstrong", "o_5004fs3lvd", "peacecorps", "bitly", "bitly", "nasat... ## ## $ al  "en-US", "en-us", "en-US,en;q=0.5", "en-US", "en", "en-US", "en-US,en;q=0.5", "en-us", "e... ## $ hh  "j.mp", "1.usa.gov", "1.usa.gov", "1.usa.gov", "1.usa.gov", "1.usa.gov", "1.usa.gov", "go... ## $ r  "direct", "http://www.usa.gov/", "http://www.facebook.com/l.php?u=http%3A%2F%2F1.usa.gov%... ## $ u  "http://www.nsa.gov/", "http://answers.usa.gov/system/selfservice.controller?CONFIGURATIO... ## $ t  1368832205, 1368832207, 1368832209, 1368832209, 1368832208, 1368832209, 1368832210, 13688... ## $ hc  1365701422, 1302189369, 1368814585, 1354719206, 1368738258, 1368130510, 1363711958, 13687... ## $ cy  "Anaheim", NA, "Fort Huachuca", "Houston", NA, "Mishawaka", "Hammond", NA, "Sydney", NA, ... ## $ ll  [<33.8161, -117.9794>, NULL, <31.5273, -110.3607>, <29.7633, -95.3633>, NULL, <41.6123, ... ## $ _heartbeat_  NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N... ## $ kw  NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N... 

ОБНОВИТЬ

Последняя версия пакета jsonlite поддерживает streamовое JSON (что и есть на самом деле). Теперь вы можете прочитать его одной строкой:

 json_file <- stream_in(file("usagov_bitly_data2013-05-17-1368832207")) 

См. Также приведенный ниже Jeroen ответ для анализа streamа, который он обрабатывает непосредственно через http.


СТАРЫЙ ОТВЕТ

Оказывается, это файл «псевдо-JSON». Я встречаю их во многих наивных системах API, в которых я работаю. Каждая строка действительна JSON, но отдельные объекты не находятся в массиве JSON. Вам нужно использовать readLines а затем создать из него свой собственный массив JSON и передать его в fromJSON :

 library(jsonlite) # read in individual JSON lines json_file <- "usagov_bitly_data2013-05-17-1368832207" # turn it into a proper array by separating each object with a "," and # wrapping that up in an array with "[]"'s. dat <- fromJSON(sprintf("[%s]", paste(readLines(json_file), collapse=","))) dim(dat) ## [1] 3959 18 str(dat) ## 'data.frame': 3959 obs. of 18 variables: ## $ a : chr "Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; HTC_PN071 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile "| __truncated__ "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4"| __truncated__ "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0" "Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; SGH-T889 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile S"| __truncated__ ... ## $ c : chr "US" NA "US" "US" ... ## $ nk : int 0 0 1 1 0 0 1 0 0 0 ... ## $ tz : chr "America/Los_Angeles" "" "America/Phoenix" "America/Chicago" ... ## $ gr : chr "CA" NA "AZ" "TX" ... ## $ g : chr "15r91" "ifIpBW" "10DaxOu" "TysVFU" ... ## $ h : chr "10OBm3W" "ifIpBW" "10DaxOt" "TChsoQ" ... ## $ l : chr "pontifier" "bitly" "jaxstrong" "o_5004fs3lvd" ... ## $ al : chr "en-US" "en-us" "en-US,en;q=0.5" "en-US" ... ## $ hh : chr "j.mp" "1.usa.gov" "1.usa.gov" "1.usa.gov" ... ## ... (goes on for a while, many columns) 

Я объединил readLines с вызовом paste / sprintf так как object.size результирующего (временного) объекта составляет 2,025,656 байт (~ 2 МБ) и не хотел делать rm на отдельной временной переменной.

Этот формат называется ndjson и предназначен для streamового импорта (включая gzip). Просто используйте это:

 con <- url("http://1usagov.measuredvoice.com/bitly_archive/usagov_bitly_data2013-05-17-1368832207.gz") mydata <- jsonlite::stream_in(gzcon(con)) 

Или, альтернативно, используйте пакет curl для повышения производительности или для настройки HTTP-запроса:

 library(curl) con <- curl("http://1usagov.measuredvoice.com/bitly_archive/usagov_bitly_data2013-05-17-1368832207.gz") mydata <- jsonlite::stream_in(gzcon(con)) 

Пакет tidyjson также может читать этот формат «json lines»: read_json("my.json",format="jsonl")

Затем результат анализируется с использованием серии труб, вместо того, чтобы иметь списки, вложенные в dataframes.

  • Как сделать паузу выполнения, спать, ждать X секунд в R?
  • Преобразование разделенных запятыми элементов в столбцы
  • data.table join, затем добавьте столбцы в существующий файл data.frame без повторной копии
  • добавление пакета RMySQL в R завершается с ошибкой (в Windows)?
  • Как получить обратную шкалу log10 в ggplot2?
  • ggplot2 - дрожание и позиция
  • Поиск всех позиций для нескольких элементов в векторе
  • Как сказать, что находится в одном векторе, а не в другом?
  • do.call (rbind, list) для нечетного числа столбцов
  • ggplot, facet, piechart: размещение текста в середине круговых диаграмм
  • Кумулятивная паста (конкатенация) значений, сгруппированных по другой переменной
  • Давайте будем гением компьютера.