将 JSON 数据展平为单独的行

Flattening JSON data into individual rows

我对使用多层嵌套对象数组展平 JSON 很感兴趣。理想情况下,我想在 Java 中执行此操作,但似乎 python 中的 Pandas 库可能对此有好处。

有人知道一个好的 java 库吗?​​

我发现这篇文章 (Create a Pandas DataFrame from deeply nested JSON) 使用 pandasjq 并且我的解决方案几乎可以工作,但我收到的输出并不完全符合预期。这是我的代码示例

json_data = '''{ "id": 1,
"things": [
    {
        "tId": 1,
        "objs": [{"this": 99},{"this": 100}]
    },
    {
        "tId": 2,
        "objs": [{"this": 222},{"this": 22222}]
    }
]
 }'''

rule = """[{id: .id, 
        tid: .things[].tId,
        this: .things[].objs[].this}]"""
out = jq(rule, _in=json_data).stdout
res = pd.DataFrame(json.loads(out))

问题是我收到的输出是这样的:

   id   this  tid
0   1     99    1
1   1    100    1
2   1    222    1
3   1  22222    1
4   1     99    2
5   1    100    2
6   1    222    2
7   1  22222    2

我期待看到

   id   this  tid
0   1     99    1
1   1    100    1
3   1    222    2
4   1  22222    2

关于如何使这项工作的任何提示、不同的解决方案或 java 选项都很棒!

提前致谢!

克雷格

问题是您的 "rule" 创建了笛卡尔积,而实际上您想要嵌套迭代。

根据您的输入,以下 jq 表达式使嵌套迭代相当清晰,产生如下所示的输出:

.id as $id
| .things[] as $thing
| $thing.objs[]
| [$id, .this, $thing.tId]
| @tsv

输出

1   99  1
1   100 1
1   222 2
1   22222   2

规则

所以大概你的规则应该是这样的:

[{id} + (.things[] | {tid: .tId} + (.objs[] | {this}))]

或者如果你想让嵌套迭代更清晰:

[ .id as $id
  | .things[] as $thing
  | $thing.objs[]
  | {id: $id, this, tid: $thing.tId} ]

运行 java

中的 jq

除了 processBuilder,您可能还想看看这些包装器: