JSON选择名称和值

时间:2019-05-12 18:11:52

标签: r

从带有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

2 个答案:

答案 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")