高级JSON查询语言

问题描述 投票:0回答:1

我已经探索了几种现有的JSON查询语言,例如JMESPathJsonPathJSONiq。不幸的是,它们似乎都无法以通用方式支持我的用例。

基本上,我从不同的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 };
  });
});

有什么想法吗?

json jsonpath jmespath jsoniq
1个回答
0
投票

最后,使用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

© www.soinside.com 2019 - 2024. All rights reserved.