从带有R的JSON文件中选择名称和值。
我有以下JSON文件:
{
"quiz": {
"sport": {
"q1": {
"question": "Which one is correct team name in NBA?",
"options": [
"New York Bulls",
"Los Angeles Kings",
"Golden State Warriros",
"Huston Rocket"
],
"answer": "Huston Rocket"
}
},
"maths": {
"q1": {
"question": "5 + 7 = ?",
"options": [
"10",
"11",
"12",
"13"
],
"answer": "12"
},
"q2": {
"question": "12 - 8 = ?",
"options": [
"1",
"2",
"3",
"4"
],
"answer": "4"
}
}
}
}
我导入JSON文件:
result <- fromJSON( "C:\\Users\\julen.peral\\Desktop\\json_files\\data\\example_2.json")
和我要选择的值。 例如: “问题”:“在NBA中,哪个是正确的球队名称?”
我将使用以下代码:
result[[1]]
然后我会得到:“在NBA中哪个是正确的球队名称?”。
我的问题是如何获得“问题”。
最后的想法是做一个循环以扫描所有名称和值,并按需要保存在数据框中。我知道有一些软件包,但我想自己做,因为我有一些json
请参见代码以扫描值(我希望名称相同)
for(a in 1:length(result)) {
for (b in 1:length(result[[a]])){
for (c in 1:length(result[[a]][[b]])){
for (d in 1:length(result[[a]][[b]][[c]])){
for (e in 1:length(result[[a]][[b]][[c]][[d]])){
for (f in 1:length(result[[a]][[b]][[c]][[d]][[e]])){
print(result[[a]][[b]][[c]][[d]][[e]][[f]])
}}}}}}
如果运行前面的代码,我将看到以下值:
[1] "Which one is correct team name in NBA?"
[1] "New York Bulls"
[1] "Los Angeles Kings"
[1] "Golden State Warriros"
[1] "Huston Rocket"
[1] "Huston Rocket"
[1] "5 + 7 = ?"
[1] "10"
[1] "11"
[1] "12"
[1] "13"
[1] "12"
[1] "12 - 8 = ?"
[1] "1"
[1] "2"
[1] "3"
[1] "4"
[1] "4"
但是在这种情况下我不知道是问题还是答案。
谢谢您的时间
Julen
答案 0 :(得分:0)
这不是理想的解决方案,但我认为它可以极大地简化您的工作:
j <- jsonlite::fromJSON(file("~/StackOverflow/Julen.json"))
str(j)
# List of 1
# $ quiz:List of 2
# ..$ sport:List of 1
# .. ..$ q1:List of 3
# .. .. ..$ question: chr "Which one is correct team name in NBA?"
# .. .. ..$ options : chr [1:4] "New York Bulls" "Los Angeles Kings" "Golden State Warriros" "Huston Rocket"
# .. .. ..$ answer : chr "Huston Rocket"
# ..$ maths:List of 2
# .. ..$ q1:List of 3
# .. .. ..$ question: chr "5 + 7 = ?"
# .. .. ..$ options : chr [1:4] "10" "11" "12" "13"
# .. .. ..$ answer : chr "12"
# .. ..$ q2:List of 3
# .. .. ..$ question: chr "12 - 8 = ?"
# .. .. ..$ options : chr [1:4] "1" "2" "3" "4"
# .. .. ..$ answer : chr "4"
这是一种“整洁”的处理方式:
purrr::flatten_dfc(j) %>%
tidyr::unnest(.) %>%
as.list(.)
# $q1
# [1] "Which one is correct team name in NBA?"
# [2] "New York Bulls"
# [3] "Los Angeles Kings"
# [4] "Golden State Warriros"
# [5] "Huston Rocket"
# [6] "Huston Rocket"
# $q11
# [1] "5 + 7 = ?" "10" "11" "12" "13" "12"
# $q2
# [1] "12 - 8 = ?" "1" "2" "3" "4"
# [6] "4"
不幸的是,您丢失了实际的问题名称,因为第二个q1
变成了q11
。而且所有部分都在一个向量中:问题是character
向量中的第一个,答案是最后一个,而选项则介于两者之间。
(执行此操作的方法可能更直接。)
答案 1 :(得分:0)
最好将其转换为tbl_df并提取所有信息
library(tidyversse)
modify_depth(result, 2, ~
map_df(.x, ~ as_tibble(.x), .id = 'q_no') ) %>%
pluck(1) %>%
map_df(~ .x, .id = "categ")
# A tibble: 12 x 5
# categ q_no question options answer
# <chr> <chr> <chr> <chr> <chr>
# 1 sport q1 Which one is correct team name in NBA? New York Bulls Huston Rocket
# 2 sport q1 Which one is correct team name in NBA? Los Angeles Kings Huston Rocket
# 3 sport q1 Which one is correct team name in NBA? Golden State Warriros Huston Rocket
# 4 sport q1 Which one is correct team name in NBA? Huston Rocket Huston Rocket
# 5 maths q1 5 + 7 = ? 10 12
# 6 maths q1 5 + 7 = ? 11 12
# 7 maths q1 5 + 7 = ? 12 12
# 8 maths q1 5 + 7 = ? 13 12
# 9 maths q2 12 - 8 = ? 1 4
#10 maths q2 12 - 8 = ? 2 4
#11 maths q2 12 - 8 = ? 3 4
#12 maths q2 12 - 8 = ? 4 4
result <- jsonlite::fromJSON("example_2.json")