jmespath:使用属性过滤器获取键

时间:2019-03-14 20:41:16

标签: normalization jmespath

我有以下json:

{
    "dataset_1": {
        "size_in_mb": 0.5,
        "task": "clean",
        "tags": ["apple", "banana", "strawberry"]
    },
    "dataset_2": {
        "size_in_mb": 100,
        "task": "split",
        "tags": ["apple"]
    },
    "dataset_3": {
        "size_in_mb": 1024,
        "task": "clean",
        "tags": ["strawberry"]
    }
}

我如何:

  1. 获取带有名为“ apple”的标签的数据集
  2. 获取大于500mb的数据集
  3. 获取任务为“ split”的数据集

我能够查询数据集的属性,但是无法提取具有特定属性的数据集的名称。例如,当“标签”包含“草莓”时,我可以获取[“草莓”],但无法获取[“数据集_1”,“数据集_3”]。

This问题接近,但基本上说您不能使用jmespath。

1 个答案:

答案 0 :(得分:0)

你想通了这个

  • 正如您在评论中所述,如果要执行以下操作,通常最好的方法是重新标准化原始数据集以使用顺序枚举排序规则(而不是用于顶层排序规则的对象键)。通用查询与jmespath。

  • 您链接到的Stackoverflow帖子对此问题进行了更详细的介绍here

重新标准化数据集之前和之后

  • 为了使那些可能想了解更多有关您的意思的人受益,当您说我最终稍微更改了模式时...这是一个“前后”示例,看起来像

之前

  {
      "dataset_1": {
          "size_in_mb": 0.5,
          "task": "clean",
          "tags": ["apple", "banana", "strawberry"]
      },
      "dataset_2": {
          "size_in_mb": 100,
          "task": "split",
          "tags": ["apple"]
      },
      "dataset_3": {
          "size_in_mb": 1024,
          "task": "clean",
          "tags": ["strawberry"]
      }
  }

之后

  {"dataroot":[
      {
          "name":      "dataset_1",
          "size_in_mb": 0.5,
          "task": "clean",
          "tags": ["apple", "banana", "strawberry"]
      },
      {
          "name":      "dataset_2",
          "size_in_mb": 100,
          "task": "split",
          "tags": ["apple", "banana", "strawberry"]
      },
      {
          "name":      "dataset_3",
          "size_in_mb": 1024,
          "task": "clean",
          "tags": ["strawberry"]
      }
  ]}