Ansible 解析一个 JSON 对象
Ansible parsing a JSON Object
我在解析 JSON 对象时遇到问题。我从 uri 得到 JSON 对象。下一个任务需要字符串中的数字 13。有谁知道,怎么可能只从这个 JSON 对象中得到数字?
- name: GET JOB INFORMATION
uri:
url: "http://******"
method: GET
headers:
Accept: 'application/json'
Content-Type: 'application/json'
Authorization: 'Session {{ xxx.json.token }}'
register: result_job
- name: Output_1
debug:
msg: "{{ result_job.json.affectedResources }}"
- name: Output_2
debug:
msg: "{{ result_job.json.affectedResources.split('/')[0] | last }}"
当 ansible 执行任务“Output_2”时,我得到一个错误:
{"msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'split'\n\nThe error appears to have been in
任务“Output_1”的输出是这样的:
"msg": [
"/Manager/tes/objects/bew/13"
]
JSON 对象看起来像这样:
"msg": {
"affectedResources": [
"/Manager/tes/objects/bew/13"
],
"completedTime": "2022-03-16T..."
"createdTime": "2022...."
}
谢谢!
这里有一个只要满足两个条件就可以运行的脚本:
- 在字符串中(在您的例子中是“/Manager/tes/objects/bew/13”),只有一个 数字包含在'/'中。
- '/'中的数字(例如'/13/')是一个整数。
您的 JSON 对象(在脚本中称为 json_object
):
"msg": {
"affectedResources": [
"/Manager/tes/objects/bew/13"
],
"completedTime": "2022-03-16T..."
"createdTime": "2022...."
}
这是脚本。
# Navigate to the appropriate element in the JSON object
string = json_object["msg"]["affectedResources"][0]
for item in string.split('/'): # iterate on items between '/'
try:
return_val = int(item) # if the item is an integer
break # quit and keep that value
except:
return_val = None # or other default value
continue
# Result
print(return_val, type(return_val)) >>> 13, <class 'int'>
给定数据
result_job:
json:
affectedResources:
- /Manager/tes/objects/bew/13
completedTime: 2022-03-16T...
createdTime: 2022....
可以看到属性affectedResources是一个列表。你说你"need the number 13 in the string"
。在这种情况下,让我们从列表中取出第一个元素
"{{ result_job.json.affectedResources.0 }}"
给出字符串
/Manager/tes/objects/bew/13
现在,您可以拆分字符串并通过索引获取最后一项
"{{ result_job.json.affectedResources.0.split('/').[-1] }}"
,或通过过滤器
"{{ result_job.json.affectedResources.0.split('/')|last }}"
两者给出相同的结果
'13'
我在解析 JSON 对象时遇到问题。我从 uri 得到 JSON 对象。下一个任务需要字符串中的数字 13。有谁知道,怎么可能只从这个 JSON 对象中得到数字?
- name: GET JOB INFORMATION
uri:
url: "http://******"
method: GET
headers:
Accept: 'application/json'
Content-Type: 'application/json'
Authorization: 'Session {{ xxx.json.token }}'
register: result_job
- name: Output_1
debug:
msg: "{{ result_job.json.affectedResources }}"
- name: Output_2
debug:
msg: "{{ result_job.json.affectedResources.split('/')[0] | last }}"
当 ansible 执行任务“Output_2”时,我得到一个错误:
{"msg": "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'split'\n\nThe error appears to have been in
任务“Output_1”的输出是这样的:
"msg": [
"/Manager/tes/objects/bew/13"
]
JSON 对象看起来像这样:
"msg": {
"affectedResources": [
"/Manager/tes/objects/bew/13"
],
"completedTime": "2022-03-16T..."
"createdTime": "2022...."
}
谢谢!
这里有一个只要满足两个条件就可以运行的脚本:
- 在字符串中(在您的例子中是“/Manager/tes/objects/bew/13”),只有一个 数字包含在'/'中。
- '/'中的数字(例如'/13/')是一个整数。
您的 JSON 对象(在脚本中称为 json_object
):
"msg": {
"affectedResources": [
"/Manager/tes/objects/bew/13"
],
"completedTime": "2022-03-16T..."
"createdTime": "2022...."
}
这是脚本。
# Navigate to the appropriate element in the JSON object
string = json_object["msg"]["affectedResources"][0]
for item in string.split('/'): # iterate on items between '/'
try:
return_val = int(item) # if the item is an integer
break # quit and keep that value
except:
return_val = None # or other default value
continue
# Result
print(return_val, type(return_val)) >>> 13, <class 'int'>
给定数据
result_job:
json:
affectedResources:
- /Manager/tes/objects/bew/13
completedTime: 2022-03-16T...
createdTime: 2022....
可以看到属性affectedResources是一个列表。你说你"need the number 13 in the string"
。在这种情况下,让我们从列表中取出第一个元素
"{{ result_job.json.affectedResources.0 }}"
给出字符串
/Manager/tes/objects/bew/13
现在,您可以拆分字符串并通过索引获取最后一项
"{{ result_job.json.affectedResources.0.split('/').[-1] }}"
,或通过过滤器
"{{ result_job.json.affectedResources.0.split('/')|last }}"
两者给出相同的结果
'13'