2014-08-28 39 views
14

Tôi có một khung dữ liệu mà tôi muốn chuyển đổi sang định dạng json:chuyển đổi khung dữ liệu để json

khung dữ liệu của tôi gọi res1:

library(rjson) 

structure(list(id = c(1, 2, 3, 4, 5), value = structure(1:5, .Label = c("server1", 
"server2", "server3", "server4", "server5"), class = "factor")), .Names = c("id", 
"value"), row.names = c(NA, -5L), class = "data.frame") 

khi tôi làm:

toJSON(res1) 

Tôi nhận được điều này:

{"id":[1,2,3,4,5],"value":["server1","server2","server3","server4","server5"]} 

Tôi n eed đầu ra json này được như thế này, bất kỳ ý tưởng?

[{"id":1,"value":"server1"},{"id":2,"value":"server2"},{"id":3,"value":"server3"},{"id":4,"value":"server4"},{"id":5,"value":"server5"}] 
+0

Tại sao bạn cho rằng bạn muốn nó ở định dạng đó? http://jsonlint.com/ nói rằng nó không hợp lệ. – doctorlove

+0

@doctorlove, tôi đã cập nhật định dạng json tôi cần xem. Cảm ơn bạn. – user1471980

+0

Vẫn không hợp lệ ;-) 'Lỗi phân tích cú pháp trên dòng 20: ... 5," giá trị: "server5"}] --------------------- -^ Mong đợi '}', ':', ',', ']' ' – doctorlove

Trả lời

17

Làm thế nào về

library(rjson) 
x <- toJSON(unname(split(res1, 1:nrow(res1)))) 
cat(x) 
# [{"id":1,"value":"server1"},{"id":2,"value":"server2"}, 
# {"id":3,"value":"server3"},{"id":4,"value":"server4"}, 
# {"id":5,"value":"server5"}] 

Bằng cách sử dụng split() chúng ta về cơ bản phá vỡ các data.frame lớn thành một data.frame riêng biệt cho mỗi hàng. Và bằng cách loại bỏ các tên từ danh sách kết quả, hàm toJSON kết thúc tốt đẹp các kết quả trong một mảng chứ không phải là một đối tượng được đặt tên.

36

Gói jsonlite tồn tại để giải quyết chính xác vấn đề này: "Bản đồ thực tế và nhất quán giữa dữ liệu JSON và đối tượng R".

chức năng toJSON của nó cung cấp kết quả mong muốn này với các tùy chọn mặc định:

library(jsonlite) 
x <- toJSON(res1) 
cat(x) 

## [{"id":1,"value":"server1"},{"id":2,"value":"server2"}, 
## {"id":3,"value":"server3"},{"id":4,"value":"server4"}, 
## {"id":5,"value":"server5"}] 
0

Bây giờ bạn có thể dễ dàng chỉ cần gọi jsonlite::write_json() trực tiếp trên dataframe.

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