java - 将 JSON 数据展平为单独的行

标签 java python pandas jq flatten

我对使用多层嵌套对象数组来展平 JSON 很感兴趣。理想情况下,我希望用 Java 来完成此操作,但似乎 Python 中的 Pandas 库可能更适合此操作。

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

我使用 pandasjq 找到了这篇文章 ( 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/

相关文章:

java - 在 Unix 上使用 BouncycaSTLe 的 OpenPgp 加密非常慢

java - Java 中的邮寄地址?

python - 调用 super().__init__() 时会给出错误的方法

python - 使用按钮和回调方法退出Python程序

python - 按对象对组的值求和

python - 如何根据 Pandas 时间序列中的 5 分钟间隔创建组 ID?

java - 使用 Jersey 是否可以隐藏某些类别属性?

java - 如何使文件唯一或检查它们是否存在 JAVA SERVER SIDE 多文件上传

python - 如何根据正则表达式条件编辑文本文件的行?

python - 从二维数据到具有多索引列的一维 Pandas