如何在R中将Json转换为数据框

25
我想将我的JSON数据转换为R中的数据框。下面是我到目前为止所做的事情:
library("rjson")
result <- fromJSON(file ="mypath/data.json")
json_data_frame <- as.data.frame(result)

然而,出现了这样的错误:

Error in data.frame(company_id = "12345678", country_name = "China", : arguments imply differing number of rows: 1, 2, 0

我还尝试了以下代码:

library("rjson")
result <- fromJSON(file ="mypath/data.json")
final_data <- do.call(rbind, result)

同时出现了以下错误:

警告信息:在(function(...,deparse.level=1)中:结果的列数不是向量长度的倍数(arg 3)

我不知道发生了什么以及如何解决它。如果能得到帮助,我将不胜感激。

这是我的一些JSON数据片段:

{"business_id": "1234567", "Country_name": "China", "hours": {"Monday": {"close": "02:00", "open": "11:00"}, "Tuesday": {"close": "02:00", "open": "11:00"}, "Friday": {"close": "02:00", "open": "11:00"}, "Wednesday": {"close": "02:00", "open": "11:00"}, "Thursday": {"close": "02:00", "open": "11:00"}, "Sunday": {"close": "02:00", "open": "12:00"}, "Saturday": {"close": "02:00", "open": "12:00"}}, "open": true, "categories": ["Bars", "Nightlife", "Restaurants"], "city": "Beijing", "review_count": 5, "name": "Chen's Bar", "neighborhoods": ["West End"], "attributes": {"Take-out": true, "Wi-Fi": "free", "Good For": {"dessert": false, "latenight": false, "lunch": false, "dinner": false, "breakfast": false, "brunch": false}, "Good For Dancing": false, "Noise Level": "loud", "Takes Reservations": false, "Delivery": false, "Ambience": {"romantic": false, "intimate": false, "classy": false, "hipster": false, "divey": false, "touristy": false, "trendy": false, "upscale": false, "casual": false}, "Happy Hour": true, "Parking": {"garage": false, "street": false, "validated": false, "lot": false, "valet": false}, "Has TV": true, "Outdoor Seating": false, "Attire": "casual", "Alcohol": "full_bar", "Waiter Service": true, "Accepts Credit Cards": true, "Good for Kids": false, "Good For Groups": true, "Caters": true, "Price Range": 1}, "type": "business"}

4
并非所有的JSON都可以转换为data.frame,因为它们更为通用。JSON非常适合映射到R中的列表;这就是为什么fromJSON返回一个列表的原因。如果您可以将其转换为data.frame,那取决于您的对象结构。请分享一个您的JSON示例,并说明您期望的输出结果是什么样子的。 - nicola
1
你能粘贴一些包含在你的JSON中的数据吗? - enlego
感谢回答@nicola和@enlego。我已经在这里更新了一些数据。它有点复杂。你建议我直接用list分析它吗?还是尝试将其转换为数据框?(但至少我知道问题出在哪里:)谢谢) - Ping Yi Hsu
这份数据看起来像是两个源混合在一起。不过,如果你想手动尝试解包它,我建议使用类似于 JSON 到表查看器之类的工具。你可以将 JSON 保存为 .txt 文件,然后复制和粘贴。试试这个:http://www.jsontableviewer.com/# 然后你就可以逐层使用 [[1]]$... 这样的方式来逐步解包嵌套列表了。 - sconfluentus
2个回答

31

尝试使用jsonlite库。这对我有用。

fromJSON(temp) %>% as.data.frame

以下是输出 在此输入图片描述

如果您想要列表。

fromJSON(temp) 

你使用哪个包来调用“%>%”符号?我尝试了dplyr,但它对我无效。它适用于任何json吗?谢谢。 - Henry Navarro
2
我使用dplyr中的它,看这里 https://dev59.com/114d5IYBdhLWcg3wJfpm,或者你可以直接执行`as.data.frame(fromJSON(temp))`。 - Kush Patel
%>% is from library(magrittr) - Darren Bishop

7
加载jsonlite包
library(jsonlite)

wine_json 是一个 JSON

wine_json <- '{"name":"Chateau Migraine", "year":1997, "alcohol_pct":12.4, "color":"red", "awarded":false}'

将 wine_json 转换为列表:

wine <- fromJSON(wine_json)

打印葡萄酒的结构

str(wine)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接