首页 > 解决方案 > 如何在 R 中解析堆叠的嵌套 JSON 文件?

问题描述

我正在尝试使用 R 来解析堆积的 JSON 消息文件,如下所示:

{"ts":1.592932195038E9,"accel1":[{"x":26125,"y":-29824,"z":-254468,"id":"3"},{"x":27508,"y":242227,"z":84591,"id":"4"},{"x":-250265,"y":41250,"z":-11000,"id":"5"},{"x":-16089,"y":-256369,"z":17448,"id":"7"}]}
{"ts":1.592932195058E9,"accel1":[{"x":26107,"y":-29807,"z":-254479,"id":"3"},{"x":27508,"y":242227,"z":84591,"id":"4"},{"x":-250265,"y":41250,"z":-11000,"id":"5"},{"x":-16089,"y":-256369,"z":17448,"id":"7"}]}
{"ts":1.592932195078E9,"accel1":[{"x":26107,"y":-29807,"z":-254479,"id":"3"},{"x":27490,"y":242252,"z":84604,"id":"4"},{"x":-250301,"y":41180,"z":-10922,"id":"5"},{"x":-16122,"y":-256392,"z":17390,"id":"7"}]}
...

因为消息是堆叠的,所以我无法使用 fromJSON 而是使用 jsonlite::stream_in 将每个 JSON 消息读入数据帧,如下所示:

flatten(jsonlite::stream_in(file("Data.json")))

其输出为:

            ts                                                                                                   accel1
1   1592932195 26125, 27508, -250265, -16089, -29824, 242227, 41250, -256369, -254468, 84591, -11000, 17448, 3, 4, 5, 7
2   1592932195 26107, 27508, -250265, -16089, -29807, 242227, 41250, -256369, -254479, 84591, -11000, 17448, 3, 4, 5, 7
3   1592932195 26107, 27490, -250301, -16122, -29807, 242252, 41180, -256392, -254479, 84604, -10922, 17390, 3, 4, 5, 7
...

R 现在将“accel1”中的所有列视为一个大列,并且隐藏或丢弃“x”、“y”、“z”和“id”。最重要的是,现在以不同的顺序(x,x,x,x,y,y,y,y,z,z,z,z,id,id,id,id而不是所需的顺序x,y,z,id,x,y,z,id...)读取数据我如何读取文件,以便“accel1”中的每一列都用自己的列名单独处理,并且可能以所需的顺序处理?

标签: rjsonparsingstacked

解决方案


我认为解决这个问题的最简单方法可能是tidyr::unnest

### highlight the above and run this
js <- jsonlite::stream_in(textConnection(paste(readLines("clipboard"), collapse = "\n")))
#  Imported 3 records. Simplifying...
unnest(js, accel1)
# # A tibble: 12 x 5
#             ts       x       y       z id   
#          <dbl>   <int>   <int>   <int> <chr>
#  1 1592932195.   26125  -29824 -254468 3    
#  2 1592932195.   27508  242227   84591 4    
#  3 1592932195. -250265   41250  -11000 5    
#  4 1592932195.  -16089 -256369   17448 7    
#  5 1592932195.   26107  -29807 -254479 3    
#  6 1592932195.   27508  242227   84591 4    
#  7 1592932195. -250265   41250  -11000 5    
#  8 1592932195.  -16089 -256369   17448 7    
#  9 1592932195.   26107  -29807 -254479 3    
# 10 1592932195.   27490  242252   84604 4    
# 11 1592932195. -250301   41180  -10922 5    
# 12 1592932195.  -16122 -256392   17390 7    

推荐阅读