gpt4 book ai didi

json - ansible解析来自api的json数组回复

转载 作者:行者123 更新时间:2023-12-04 19:31:11 24 4
gpt4 key购买 nike

我正在尝试解析来自 API 的 json 响应。浏览器中的响应如下所示:

[{url: "abc.com/xyz"}]

我从 ansible 请求它:

- name: Get url
uri:
url: my-url...
method: GET
force: yes
return_content: yes
#HEADER_Content-Type: "application/json"
register: json_response

我从 ansible 得到回复,看起来像这样(带调试):

- name: print reply
debug:
var: json_response
verbosity: 1

给出:

 ok: [server] => {
"json_response": {
... //removed for readability
"content": "({:url \"https://the-file-I-want\"})"
}

所以似乎已经进行了一些解析(注意冒号 :)。

访问内容似乎有效(使用调试 json_response['content']):

ok: [server] => {
"json_response['content']": "({:url \"https://the-file-I-want\"})"
}

但我似乎无法访问 json 响应 url。如果我尝试获取数组的第一个元素,我会得到 "(" 所以看起来它仍然是一个字符串。

- name: print reply2
debug:
var: json_response['content'][0]
verbosity: 1

from_json 似乎不起作用:fatal: [server]: FAILED! => {"failed": true, "msg": "字段 'args' 的值无效,似乎包含 undefined variable 。...

如何解析像这样的 json 回复?

最佳答案

我创建了一个包含以下内容的 json 文件 response.json:

{
content: ({:url \"https://the-file-I-want\"})
}

然后,在我的剧本中,我加载了文件并获取您需要的 url,我创建了一个自定义的 jinja 过滤器,因为 Jinja2 没有任何用于查找子字符串或正则表达式的过滤器。

我的名为 filter.py 的自定义过滤器(您可以随意命名)位于一个名为 filter_plugins 的目录中,该目录与我的剧本位于同一目录中。我的filter.py文件如下:

import re
class FilterModule(object):
''' Custom filters are loaded by FilterModule objects '''

def filters(self):
return {'urlsubstr': self.urlsubstr}
def urlsubstr(self,content):
url = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', content)
return url[0]

创建自定义过滤器后,我得到了这样的 url:

- hosts: localhost

vars:
json_response: "{{ lookup('file', 'response.json') | from_json }}"

tasks:

- debug: msg="{{ json_response.content | urlsubstr }}"
with_dict: "{{ json_response }}"

这是运行我的剧本的输出:

TASK [setup] *******************************************************************
ok: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => (item={'value': u'({:url "https://the-file-I-want"})', 'key': u'content'}) => {
"item": {
"key": "content",
"value": "({:url \"https://the-file-I-want\"})"
},
"msg": "https://the-file-I-want"
}

希望这会有所帮助。

关于json - ansible解析来自api的json数组回复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40941217/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com