将 JSON 数据展平为单独的行
Flattening JSON data into individual rows
我对使用多层嵌套对象数组展平 JSON 很感兴趣。理想情况下,我想在 Java 中执行此操作,但似乎 python 中的 Pandas 库可能对此有好处。
有人知道一个好的 java 库吗?
我发现这篇文章 (Create a Pandas DataFrame from deeply nested JSON) 使用 pandas
和 jq
并且我的解决方案几乎可以工作,但我收到的输出并不完全符合预期。这是我的代码示例
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
,您可能还想看看这些包装器:
我对使用多层嵌套对象数组展平 JSON 很感兴趣。理想情况下,我想在 Java 中执行此操作,但似乎 python 中的 Pandas 库可能对此有好处。
有人知道一个好的 java 库吗?
我发现这篇文章 (Create a Pandas DataFrame from deeply nested JSON) 使用 pandas
和 jq
并且我的解决方案几乎可以工作,但我收到的输出并不完全符合预期。这是我的代码示例
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
,您可能还想看看这些包装器: