首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JMESPath数据过滤

JMESPath数据过滤
EN

Stack Overflow用户
提问于 2020-01-16 21:14:00
回答 1查看 2.6K关注 0票数 2

我正在尝试将Ansible脚本转换为函数。在我的Python中,我使用图书馆按日期进行筛选,这是一个以ISO8601格式提供的字符串。

我的过滤器在我的Ansible脚本中工作,也使用JMESPath网站工具。我不明白为什么我的Python版本不能工作;Ansible是编写Python的,所以我希望它能以同样的方式工作。

这适用于Ansible:

代码语言:javascript
复制
 - name: parse groups
      debug:
        msg: "{{ results_gitlabGroupsProjects | to_json | from_json  | json_query(projects_query) }}"
      vars:
        projects_query: "json[?last_activity_at > `{{gitlab_date}}`].{name: name, id: id, last_activity_at: last_activity_at }"
      register: gitlabGroupsProjects2

当我尝试用Python做同样的事情时,我会得到一个空列表,[]

代码语言:javascript
复制
compareTime="2020-01-15T17:55:3S.390Z"
plist2 = jmespath.search('[?last_activity_at > `str(compareTime)`]', project_data )
with open('plist2.json', 'w') as json_file:
    json.dump(plist2, json_file)

示例JSON数据:

代码语言:javascript
复制
[
  {
    "name": "test",
    "id": 16340975,
    "last_activity_at": "2020-01-15T20:12:49.775Z"
  },
  {
    "name": "test1",
    "id": 11111111,
    "last_activity_at": "2020-01-15T15:57:29.670Z"
  },
  {
    "name": "test2",
    "id": 222222,
    "last_activity_at": "2020-01-15T23:08:22.313Z"
  },
  {
    "name": "test3",
    "id": 133333,
    "last_activity_at": "2020-01-15T22:28:42.628Z"
  },
  {
    "name": "test4",
    "id": 444444,
    "last_activity_at": "2020-01-14T02:20:47.496Z"
  },
  {
    "name": "test5",
    "id": 555555,
    "last_activity_at": "2020-01-13T04:54:18.353Z"
  },
  {
    "name": "test6",
    "id": 66666666,
    "last_activity_at": "2020-01-12T07:12:05.858Z"
  },
  {
    "name": "test7",
    "id": 7777777,
    "last_activity_at": "2020-01-10T20:52:32.269Z"
  }
]

使用Ansible,并在JMESPath网站上获得以下输出:

代码语言:javascript
复制
[
  {
    "name": "test",
    "id": 16340975,
    "last_activity_at": "2020-01-15T20:12:49.775Z"
  },
  {
    "name": "test2",
    "id": 222222,
    "last_activity_at": "2020-01-15T23:08:22.313Z"
  },
  {
    "name": "test3",
    "id": 133333,
    "last_activity_at": "2020-01-15T22:28:42.628Z"
  }
]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-16 21:18:53

您不能只将一个str(compareTime)表达式作为字符串文本,让Python理解这就是您想要替换的内容。

在弦中

代码语言:javascript
复制
'[?last_activity_at > `str(compareTime)`]'

没有什么是动态的;str(compareTime)字符对Python没有特殊的意义。

在Ansible中,您使用了特殊的语法{{gitlab_date}},告诉Ansible以不同的方式对待字符串,并且在将其用作JMESPath查询之前,gitlab_date变量的值在此时被放置到字符串中。

在Python中,您需要类似的东西。例如,你可以使用格式化字符串文字,或

代码语言:javascript
复制
plist2 = jmespath.search(f"[?last_activity_at > `{compareTime}`]", project_data)

字符串文字之前的f告诉{...}查找{...}大括号之间的任何表达式,因此compareTime在字符串的那个点被排入位置。这非常类似于Ansible语法。

上面的内容产生了您的预期输出:

代码语言:javascript
复制
>>> jmespath.search(f"[?last_activity_at > `{compareTime}`]", project_data)
[{'name': 'test', 'id': 16340975, 'last_activity_at': '2020-01-15T20:12:49.775Z'}, {'name': 'test2', 'id': 222222, 'last_activity_at': '2020-01-15T23:08:22.313Z'}, {'name': 'test3', 'id': 133333, 'last_activity_at': '2020-01-15T22:28:42.628Z'}]
>>> from pprint import pprint
>>> pprint(_)
[{'id': 16340975,
  'last_activity_at': '2020-01-15T20:12:49.775Z',
  'name': 'test'},
 {'id': 222222,
  'last_activity_at': '2020-01-15T23:08:22.313Z',
  'name': 'test2'},
 {'id': 133333,
  'last_activity_at': '2020-01-15T22:28:42.628Z',
  'name': 'test3'}]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59777876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档