我已经探索了几种现有的JSON查询语言,例如JMESPath,JsonPath和JSONiq。不幸的是,它们似乎都无法以通用方式支持我的用例。
基本上,我从不同的Web服务收到不同类型的响应。我需要使用户能够以其他方式在二维数组中重新映射响应,以利用我们的可视化工具。基于新格式,用户可以决定如何在现有窗口小部件之间显示其数据。就像完全在用户界面上管理的可定制仪表板一样。
无论如何我的输入看起来像:
{
"category_1": [
{
"name": "medium",
"count": 10
},
{
"name": "high",
"count": 20
}
],
"category_2": [
{
"name": "medium",
"count": 30
},
{
"name": "high",
"count": 40
}
]
}
预期输出:
[
{
"name": "medium",
"count": 10,
"category": "1"
},
{
"name": "high",
"count": 20,
"category": "1"
},
{
"name": "medium",
"count": 30,
"category": "2"
},
{
"name": "high",
"count": 40,
"category": "2"
}
]
我走得更近是JMESPath,但查询根本不是动态的。用户需要知道可能的分组类别。
查询看起来像:[ category_1[].{name: name, count: count, category: '1'}, category_2[].{name: name, count: count, category: '2'} ] | []
换句话说,我需要足够强大的JSON查询语言来执行此JavaScript代码:
const output = flatMap(input, (value, key) => {
return value.map(x => {
return { ...x, category: key };
});
});
有什么想法吗?
最后,使用Zorba实现通过JSONiq管理一种方式。如果您需要功能强大的JSON查询,绝对可以采用的方法。显然,这已通过Rumble
集成在Apache Spark中无论如何,这是我的解决方案:
jsoniq version "1.0";
let $categories :=
{
"category_1": [
{
"name": "medium",
"count": 10
},
{
"name": "high",
"count": 20
}
],
"category_2": [
{
"name": "medium",
"count": 30
},
{
"name": "high",
"count": 40
}
]
}
for $key in keys($categories), $row in flatten($categories.$key)
return {"count": $row.count, "name": $row.name, "category": $key}
输出:
{ "count" : 10, "name" : "medium", "category" : "category_1" }{ "count" : 20, "name" : "high", "category" : "category_1" }{ "count" : 30, "name" : "medium", "category" : "category_2" }{ "count" : 40, "name" : "high", "category" : "category_2" }
您可以尝试Zorba here。