Mengimpor data dari file JSON ke R

166

Apakah ada cara untuk mengimpor data dari file JSON ke R? Lebih khusus lagi, file adalah array objek JSON dengan bidang string, objek, dan array. Paket RJSON tidak begitu jelas tentang cara menangani http://cran.r-project.org/web/packages/rjson/rjson.pdf ini .

pengguna313967
sumber
3
Duplikat: stackoverflow.com/questions/2061897/parse-json-with-r . Jika Anda memiliki contoh data spesifik, itu akan membantu. Kalau tidak rjson dapat melakukan apa yang Anda butuhkan, bersama dengan manipulasi data (misalnya dengan fungsi terapkan atau plyr).
Shane
Mirip dengan pertanyaan ini: stackoverflow.com/questions/2260147/… .
Shane
Hai Shane, mencoba menggunakan RJSON. Saya tertarik sebagian besar pada manipulasi data yang diperlukan. Berikut adalah contoh file JSON yang sedang saya kerjakan. example.json: [{"winner": "68694999", "votes": [{"ts": "Kam 25 Mar 03:13:01 UTC 2010", "user": {"name": "Lamur", "user_id": "68694999"}}, {"ts": "Kam 25 Mar 03:13:08 UTC 2010", "user": {"name": "Lamur", "user_id": "68694999"}} ], "lastVote": {"timestamp": 1269486788526, "user": {"name": "Lamur", "user_id": "68694999"}}, "startPrice": 0}, ...]
user313967
1
Peringatan: Jika file JSON benar-benar besar, tampaknya perpustakaan .so atau .dll tidak akan memprosesnya. Format yang lebih disukai adalah NetCDF, tetapi beberapa organisasi tidak mengetahui masalah ini.

Jawaban:

187

Pertama instal rjsonpaket:

install.packages("rjson")

Kemudian:

library("rjson")
json_file <- "http://api.worldbank.org/country?per_page=10&region=OED&lendingtype=LNX&format=json"
json_data <- fromJSON(paste(readLines(json_file), collapse=""))

Pembaruan: sejak versi 0.2.1

json_data <- fromJSON(file=json_file)
rcs
sumber
1
Perhatikan bahwa pengeditan mengacu pada pembaruan ke perpustakaan, bukan ke R. Pembaruan mengubah baris terakhir dari contoh sebelumnya dan Anda masih perlu memuat di perpustakaan seperti di atas.
Steven Waterman
90

jsonliteakan mengimpor JSON ke dalam kerangka data. Secara opsional dapat meratakan objek bersarang. Array bersarang akan menjadi bingkai data.

> library(jsonlite)
> winners <- fromJSON("winners.json", flatten=TRUE)
> colnames(winners)
[1] "winner" "votes" "startPrice" "lastVote.timestamp" "lastVote.user.name" "lastVote.user.user_id"
> winners[,c("winner","startPrice","lastVote.user.name")]
    winner startPrice lastVote.user.name
1 68694999          0              Lamur
> winners[,c("votes")]
[[1]]
                            ts user.name user.user_id
1 Thu Mar 25 03:13:01 UTC 2010     Lamur     68694999
2 Thu Mar 25 03:13:08 UTC 2010     Lamur     68694999
xn.
sumber
Benar! Sangat mudah untuk bekerja dengan data.frame daripada daftar saat menyaring hasil!
MS Berends
31

Paket alternatif adalah RJSONIO. Untuk mengonversi daftar bersarang, lapply dapat membantu:

l <- fromJSON('[{"winner":"68694999",  "votes":[ 
   {"ts":"Thu Mar 25 03:13:01 UTC 2010", "user":{"name":"Lamur","user_id":"68694999"}},   
   {"ts":"Thu Mar 25 03:13:08 UTC 2010", "user":{"name":"Lamur","user_id":"68694999"}}],   
  "lastVote":{"timestamp":1269486788526,"user":
   {"name":"Lamur","user_id":"68694999"}},"startPrice":0}]'
)
m <- lapply(
    l[[1]]$votes, 
    function(x) c(x$user['name'], x$user['user_id'], x['ts'])
)
m <- do.call(rbind, m)

memberikan informasi tentang suara dalam contoh Anda.

Karsten W.
sumber
1
x$user$name, x$user$user_idseharusnya sekarang x$user['name'], x$user['user_id']. Juga, m <- do.call(rbind, m)mungkin cara yang lebih baik untuk mengubah daftar menjadi sebuah matriks.
jbaums
apakah ada sesuatu seperti fungsi convertToDataFrame untuk JSON (seperti ada untuk paket XML)?
userJT
16

Jika URL adalah https, seperti yang digunakan untuk Amazon S3, maka gunakan getURL

json <- fromJSON(getURL('https://s3.amazonaws.com/bucket/my.json'))
Anthony
sumber
11
PSA: getURL ada di pacakge RCurl.
Mark McDonald
1
Juga,Error in function (type, msg, asError = TRUE) : Protocol "s3" not supported or disabled in libcurl
d8aninja
3

Pertama-tama instal paket RJSONIO dan RCurl:

install.packages("RJSONIO")
install.packages("(RCurl")

Coba kode di bawah ini menggunakan RJSONIO di konsol

library(RJSONIO)
library(RCurl)
json_file = getURL("https://raw.githubusercontent.com/isrini/SI_IS607/master/books.json")
json_file2 = RJSONIO::fromJSON(json_file)
head(json_file2)

Moby M
sumber
2

paket:

  • perpustakaan (httr)
  • perpustakaan (jsonlite)

Saya mengalami masalah saat mengubah json ke dataframe / csv. Untuk kasus saya, saya lakukan:

Token <- "245432532532"
source <- "http://......."
header_type <- "applcation/json"
full_token <- paste0("Bearer ", Token)
response <- GET(n_source, add_headers(Authorization = full_token, Accept = h_type), timeout(120), verbose())
text_json <- content(response, type = 'text', encoding = "UTF-8")
jfile <- fromJSON(text_json)
df <- as.data.frame(jfile)

lalu dari df ke csv.

Dalam format ini seharusnya mudah untuk mengubahnya menjadi beberapa .csvs jika diperlukan.

Bagian yang penting adalah fungsi konten yang harus dimiliki type = 'text'.

Aaron C
sumber
1

impor paket httr

library(httr)

Dapatkan url

url <- "http://www.omdbapi.com/?apikey=72bc447a&t=Annie+Hall&y=&plot=short&r=json"
resp <- GET(url)

Cetak konten resp sebagai teks

content(resp, as = "text")

Cetak konten resp

content(resp)

Gunakan konten () untuk mendapatkan konten resp, tetapi kali ini tidak menentukan argumen kedua. R mengetahui secara otomatis bahwa Anda berurusan dengan JSON, dan mengonversi JSON ke daftar R yang bernama.

Adarsh ​​Pawar
sumber