2014-10-23 19 views
12

Tôi đang cố gắng để đọc một tệp JSON vào R nhưng tôi đã nhận lỗi này:Lỗi tập tin phân tích cú pháp JSON với gói jsonlite

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

Tôi tải về các tập tin từ http://1usagov.measuredvoice.com/ và giải nén nó bằng cách sử 7zip, sau đó tôi sử dụng đoạn mã sau trong R:

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

Tôi không chắc tại sao lỗi này xảy ra, tôi tra cứu trong Google nhưng không có thông tin, ai đó có thể giúp tôi? Đây có phải là sự cố tệp hoặc mã của tôi không?

+0

Đây là lần đầu tiên tôi làm việc với các tệp JSON, tôi không chắc họ trông như thế nào, có thể là một vấn đề với tệp JSON? Tôi có cần thực hiện một số quy trình xử lý trước trên tệp không? Cảm ơn đã phản ứng nhanh chóng! – adolfohc

Trả lời

33

KHÁC CẬP NHẬT

Bạn có thể sử dụng gói ndjson để xử lý ndjson này/luồng dữ liệu JSON. Đó là nhanh hơn so với jsonlite::stream_in() và luôn tạo ra một khung dữ liệu "phẳng" hoàn toàn:

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 

Nếu chúng ta xem xét các dữ liệu frame2 kết quả, bạn sẽ thấy ndjson mở rộng ll vào ll.0ll.1 nơi bạn có được một cột list trong jsonlite rằng bạn phải đối phó với sau này.

ndjson:

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

CẬP NHẬT

Phiên bản mới nhất của gói jsonlite hỗ trợ streaming JSON (đó là những gì này thực sự là). Bây giờ bạn có thể đọc nó với một dòng như sau:

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

Xem thêm câu trả lời của Jeroen dưới đây để phân tích cú pháp luồng trực tiếp qua http.


OLD ĐÁP

Hóa ra đây là một "giả JSON" tập tin. Tôi bắt gặp chúng trong nhiều hệ thống API ngây thơ mà tôi làm việc. Mỗi dòng là JSON hợp lệ, nhưng các đối tượng riêng lẻ không nằm trong một mảng JSON. Bạn cần phải sử dụng readLines và sau đó xây dựng riêng, mảng JSON hợp lệ của bạn từ nó và vượt qua đó vào 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) 

tôi kết hợp các readLines với các cuộc gọi paste/sprintf kể từ khi object.size của kết quả (tạm thời) đối tượng là 2,025,656 byte (~ 2MB) và không cảm thấy muốn thực hiện một số rm trên biến tạm thời riêng biệt.

+1

Điều này giải quyết được vấn đề, tôi chưa bao giờ nghĩ đến việc đó, cảm ơn! – adolfohc

6

Định dạng này được gọi là ndjson và được thiết kế để truyền trực tuyến nhập (bao gồm cả gzip).Chỉ cần sử dụng này:

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

Hoặc cách khác sử dụng gói curl cho hiệu suất tốt hơn hoặc để tùy chỉnh theo yêu cầu http:

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

Gói tidyjson cũng có thể đọc "dòng json" định dạng: read_json("my.json",format="jsonl")

Đầu ra sau đó được phân tích bằng cách sử dụng một loạt các đường ống, thay vì có danh sách được lồng với các khung dữ liệu.

Các vấn đề liên quan