如何使用JMESPath

时间:2019-01-15 06:02:34

标签: json normalization jmespath

我正在寻找使用JMESPath更改第三方API的数据结构的方法,还没有弄清楚如何获取键值对的单个对象并将其重组为一个对象数组,每个对象包含键值对。

我已经遍历了所有JMESPath docsexamples,但没有找到我一直在使用的特定数据结构。我曾尝试使用keys(@)values(@)内置函数来获取这些对的键和值,但是还无法将它们连接到一个数组中。

这是我的原始JSON数据

{
"time": 32,
    "terms": {
        "192.168.10.121": 84,
        "154.223.10.121": 12,
        "112.149.10.121": 6
    }
}

我正在尝试使用JMESPath将上述JSON数据转换为以下strucutre。

{
"data": [
    { "ip_address": "192.168.10.121", "count": 84 },
    { "ip_address": "154.223.10.121", "count": 12 },
    { "ip_address": "112.149.10.121", "count": 6 }
]}

我已经能够创建键数组或值数组,但无法创建包含键值对的对象数组。 terms.{ data: keys(@)} terms.{ data: values(@)}

使用terms.{ data: keys(@)}

时的结果
{
"data": [
    "192.168.10.121",
    "154.223.10.121",
    "112.149.10.121"
]}

使用terms.{ data: values(@)}

时的结果
{
"data": [
    84,
    12,
    6
]}

这两个函数似乎是我可以用来从对象中提取键和值的唯一函数,这些对象包含最初不在数组中的键-值对。据我所知,我无法像上面的示例那样将这两个函数结合在一起以输出单个数组。

我什至不确定使用JMESPath是否可以实现。任何专家的意见都将不胜感激。

1 个答案:

答案 0 :(得分:0)

上下文

  • jmespath查询语言
  • 如何将数据从一种结构(模式)重新规范化
  • 如何有效地迭代和过滤对象属性(名称/值对)

陷阱

  • 通常来说,jmespath在迭代顺序索引数组方面具有很高的灵活性,但是在对象属性的迭代方面则缺乏灵活性
  • 当目标是遍历对象属性时,大多数使用jmespath进行的转换会变得非常麻烦
  • 通常,如果您愿意手工“手动构建”输出,则可以在jmespath中生成任意输出...这通常是在处理对象属性(又名/值对)迭代时的权衡取舍。 / li>

示例

  

给出以下原始数据集...

{"time": 32,
    "terms": {
        "192.168.10.121": 84,
        "154.223.10.121": 12,
        "112.149.10.121": 6
    }
}
  

...以下jmespath查询...

{"data": [
  { "ip_address": @.terms|keys(@)[0], "count": @.terms|values(@)[0] }
  ,{ "ip_address": @.terms|keys(@)[1], "count": @.terms|values(@)[1] }
  ,{ "ip_address": @.terms|keys(@)[2], "count": @.terms|values(@)[2] }
]}
  

...产生以下结果

{"data": [
    { "ip_address": "192.168.10.121", "count": 84 },
    { "ip_address": "154.223.10.121", "count": 12 },
    { "ip_address": "112.149.10.121", "count": 6 }
]}