【问题标题】:How to take key value pairs and turn them into an array of objects using JMESPath如何获取键值对并使用 JMESPath 将它们转换为对象数组
【发布时间】:2019-06-09 03:30:33
【问题描述】:

我正在寻找使用 JMESPath 更改第 3 方 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 数据转换为以下结构。

{
"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。任何专家意见将不胜感激。

【问题讨论】:

    标签: json normalization jmespath


    【解决方案1】:

    上下文

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

    陷阱

    • 一般来说,jmespath 在迭代顺序索引数组时非常灵活,但在迭代对象属性时灵活性要低得多
    • 当目标是迭代对象属性时,大多数使用 jmespath 的转换变得非常麻烦
    • 如果您愿意手动“手动构造”输出,通常可以在 jmespath 中生成任意输出...这通常是处理对象属性(也称为名称-值对)的迭代时的权衡

    示例

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

    {"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 }
    ]}
    

    【讨论】:

      猜你喜欢
      • 2020-12-21
      • 2019-12-02
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      • 1970-01-01
      相关资源
      最近更新 更多