Java 将JSON数据展平到单独的行中

Java 将JSON数据展平到单独的行中,java,python,pandas,jq,flatten,Java,Python,Pandas,Jq,Flatten,我感兴趣的是用多层嵌套的对象数组来扁平化JSON。理想情况下,我希望用Java实现这一点,但python中的Pandas库似乎对这一点很有帮助 有人知道这方面的好java库吗 我发现这篇文章()使用了pandas和jq,我的解决方案几乎可以工作,但我收到的结果并不完全符合预期。这是我的代码示例 json_data = '''{ "id": 1, "things": [ { "tId": 1, "objs": [{"this": 99},{"this": 1

我感兴趣的是用多层嵌套的对象数组来扁平化JSON。理想情况下,我希望用Java实现这一点,但python中的Pandas库似乎对这一点很有帮助

有人知道这方面的好java库吗

我发现这篇文章()使用了
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选项都将非常有用

提前谢谢

Craig

问题在于,您的“规则”创建了笛卡尔积,而实际上您需要嵌套迭代

通过您的输入,下面的jq表达式(它使嵌套迭代相当清晰)将生成如下所示的输出:

.id as $id
| .things[] as $thing
| $thing.objs[]
| [$id, .this, $thing.tId]
| @tsv
输出 统治 所以你的规则大概应该是这样的:

[{id} + (.things[] | {tid: .tId} + (.objs[] | {this}))]
或者,如果希望使嵌套迭代更清晰:

[ .id as $id
  | .things[] as $thing
  | $thing.objs[]
  | {id: $id, this, tid: $thing.tId} ]
在java中运行jq 除了
processBuilder
,您可能还想看看以下包装:


如果你只是想调用
json.loads
结果,我不知道使用
jq
是否比直接在Python中解码
json\u数据
本身并处理结果的
dict
更有效。这对我来说很有用!谢谢你知道用java运行jq的方法吗?@craigtb,与运行任何其他外部程序的方法相同
ProcessBuilder(“jq”,jqScriptHere)。重定向输入(placeWithInputJson)。重定向输出(placeYouWantYourOutput)。start()
,或诸如此类。
[ .id as $id
  | .things[] as $thing
  | $thing.objs[]
  | {id: $id, this, tid: $thing.tId} ]