我对使用多层嵌套对象数组来展平 JSON 很感兴趣。理想情况下,我希望用 Java 来完成此操作,但似乎 Python 中的 Pandas 库可能更适合此操作。
有人知道一个好的java库吗?
我使用 pandas
和 jq
找到了这篇文章 ( Create a Pandas DataFrame from deeply nested JSON ),我的解决方案几乎可以工作,但我收到的输出并不完全符合预期。这是我的代码示例
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 选项都会很棒!
提前致谢!
克雷格
最佳答案
问题在于您的“规则”创建了笛卡尔积,而实际上您想要嵌套迭代。
根据您的输入,以下 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
之外,您可能还想看看这些包装器:
关于java - 将 JSON 数据展平为单独的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54426122/