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...."
   }

谢谢!

这里有一个只要满足两个条件就可以运行的脚本:

  1. 在字符串中(在您的例子中是“/Manager/tes/objects/bew/13”),只有一个 数字包含在'/'中。
  2. '/'中的数字(例如'/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'