Java 将JSON数据展平到单独的行中
我感兴趣的是用多层嵌套的对象数组来扁平化JSON。理想情况下,我希望用Java实现这一点,但python中的Pandas库似乎对这一点很有帮助 有人知道这方面的好java库吗 我发现这篇文章()使用了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
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} ]