- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试将 Ansible 脚本转换为 Python AWS lambda 函数。在我的 Python 脚本中,我使用 jmespath
library按日期过滤,日期以 ISO 8601 格式的字符串形式给出。
我的过滤器在我的 Ansible 脚本中工作,并且还使用 JMESPath website tool 。我不明白为什么我的 Python 版本不能工作; Ansible 是用 Python 编写的,所以我希望它能以同样的方式工作。
这在 Ansible 中有效:
- 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 中执行相同的操作时,我得到一个空列表,[]
:
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 数据:
[
{
"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 网站上我得到以下输出:
[
{
"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"
}
]
最佳答案
您不能只将 str(compareTime)
表达式作为字符串文字放入,然后让 Python 理解这就是您想要替换的内容。
在字符串中
'[?last_activity_at > `str(compareTime)`]'
没有什么是动态的;字符 str(compareTime)
对 Python 来说没有特殊含义。
在 Ansible 中,您使用了特殊语法 {{gitlab_date}}
来告诉 Ansible 以不同方式处理字符串以及 gitlab_date< 的值
变量在将其用作 JMESPath 查询之前被放入此时的字符串中。
在Python中,你需要类似的东西。例如。你可以使用 formatted string literal, or f-string :
plist2 = jmespath.search(f"[?last_activity_at > `{compareTime}`]", project_data)
字符串文字之前的 f
告诉 Python 查找 {...}
大括号之间的任何表达式,因此 compareTime
被插入放在弦的该点上。这很像 Ansible 语法。
上面产生了您预期的输出:
>>> 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'}]
关于python - JMESPath 日期过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59777876/
在 jq 过滤语言中,. 过滤器表达式简单地返回输入的 JSON 不变( pretty-print 除外)。例如 $ echo '{"foo": true, "bar": 42}' | jq '.'
我有一个 JSON,我需要使用 JMESPATH 选择人员角色的值。我可以仅使用一个静态 id 来完成此操作,例如 roles[?id=='1324'],但我无法使用从 JSON 中选择的角色 id
我有一个包含两个数组的 JSON 对象 - 一个 keys 数组和一个 values 数组,两者的长度相同。使用 jmespath,我想使用 keys 数组的值作为键,使用 values 数组的值作为
我正在尝试查找恰好具有 2 个内核的所有虚拟机: $ az vm list-sizes -o json --query "[?numberOfCores == 2]" az vm list-sizes
我有一个使用 JMESPath 解析的对象,其中属性的值是编码为字符串的 JSON 对象。我希望能够将该字符串属性解析为 JSON 对象并仅使用 JMESPath 使用它(我知道我可以使用 JSON
以下 JmesPath 表达式查找已标记为团队的实例: "Instances[?Tags[?Key=='team']]" 您知道如何查找未标记为团队的实例吗? 我试过了: "Instances[?!T
我有一个 JSON { "key": "processId-29231", "fields": { "attachment": [ { "id": "7
我有一个字典列表,其中一个字段中包含另一个列表。我想“展平”该列表,因此它为我提供了每个子元素,并将父元素中的一个字段(或某些字段)复制到其中。示例: 源数据: [ { "na
是否可以编写 JMESPath 表达式以返回设置了特定子属性值的对象名称列表?在下面的示例中,我想获取所有主机名的列表,其中 fileexists.stat.exists 设置为 true。 我的目标
我一直在研究 JMESPath 的官方文档和一些其他资源。但是我没有成功完成以下任务: 我的数据结构是来自 vimeo api(视频列表)的 json:数据数组包含很多对象,每个对象都是上传的文件,有
我有以下示例 json 文档(对象的对象): { "key1": { "key1a": [{"key1aa": "value1aa"}, {"key1ab": "value1ab"}],...
在带有此查询的 JMESPath 中: people[].{"index":@.index,"name":name, "state":state.name} 在此示例数据上: { "people"
我意识到这里还有其他几个 JmesPath 连接问题,但是我遇到了一个单独的问题,我没有找到任何示例,我需要连接(即连接)一组动态的 JSON 值 -命名键合并为单个元素。 如果我从以下 JSON 数
使用 JMESPath,是否可以根据输入中是否存在多个键/值对来过滤输出? 从下面的示例 JSON 中,我想要做的是仅提取 Tags 中包含这些键/值对的对象 - Environment / ABC
尽管进行了大量研究,我还是找不到解决方案。我被 contains 函数困住了。我有这个 Json 文件: { "from": "Api", "success": true, "me
尽管进行了大量研究,我还是找不到解决方案。我被 contains 函数困住了。我有这个 Json 文件: { "from": "Api", "success": true, "me
我正在尝试将 Ansible 脚本转换为 Python AWS lambda 函数。在我的 Python 脚本中,我使用 jmespath library按日期过滤,日期以 ISO 8601 格式的字
有一个如下所示的对象: { "pick": "a", "elements": [ {"id": "a", "label": "First"}, {"id": "b", "lab
我正在寻找使用 JMESPath 更改 3rd 方 API 的数据结构,但一直无法弄清楚如何获取键值对的单个对象并将其重构为对象数组,每个对象都包含键值对。 我已经浏览了所有 JMESPath doc
假设我有 json: [ [0, "a"], [1, "b"], [2, "c"] ] 如何创建 JMESPath 投影以获取: [ {"id": 0, "name": "a"}, {"
我是一名优秀的程序员,十分优秀!