从python列表创建JSON数组

时间:2017-12-13 12:56:17

标签: python arrays json ansible

我目前正在尝试编写一些内容来将Ansible库存文件转换为JSON数组,这样可以将其转换为awx / tower但是我一直在努力从当前的库存文件格式构建一个全新的数组。我避免使用任何Ansible python API模块,因为无法保证未来的更新不会破坏这些。我找到的一个解决方案不再有效,因为Ansible InventoryParser python模块似乎有了变化,所以我试图想出一个Python 2.7解决方案。

示例清单文件;

[test]
host1
host2
[test1]
host3
host4

[]表示组,其他条目是将成为键:值关系的主机。我已经将它转换为python中的列表,然后我尝试将其格式化为一个键:值设置使用[]作为从值中拆分键的位置。

both = []
f = open(filename, "r")
line = f.readline().strip()
while line:
    both.append(line)
    line = f.readline().strip()
f.close()

start = '['
end = ']'
json_dict = {'all': [dict(item.split(start)[1].split(end)[0] for item in 
both)]}

print json.dumps(json_dict)

不幸的是,这会返回错误: ValueError:字典更新序列元素#0的长度为4; 2是必需的

虽然说实话但我不确定这会回归我想要的东西。

希望有人可以指出我正确的方向或突出我到目前为止出错的地方。

干杯

编辑:为实际预期的输出添加一些代码;

{
[test]: {
    'hosts': ['host1', 'host2'],
    },
[test1]: {
    'hosts': ['host3', 'host4'],
    }
} 

我正在努力实现的更详细的输出示例;

{
    "databases"   : {
        "hosts"   : [ "host1.example.com", "host2.example.com" ],
        "vars"    : {
            "a"   : true
        }
    },
    "webservers"  : [ "host2.example.com", "host3.example.com" ],
    "atlanta"     : {
        "hosts"   : [ "host1.example.com", "host4.example.com", 
"host5.example.com" ],
        "vars"    : {
            "b"   : false
        },
    },
    "marietta"    : [ "host6.example.com" ],
    "5points"     : [ "host7.example.com" ]
}

因此,我们有一个保存组名的密钥,其中包含主机和变量的密钥:值对。

经过一些研究后,我更接近我想要的输出,使用以下代码;

both = {}
group = None

with open(filename, "r") as f:
    line = f.readline().strip()
    while line:
        if line.startswith('#') or line.startswith(';') or len(line) == 0:
            continue

        if line.startswith("["):
            # is a group
            group = line
            both[group] = {}
        elif not line.startswith("["):
            host = line
            both[group][host] = {}
        line = f.readline().strip()
f.close()

return both

返回以下内容并不是我所追求的,但我觉得我正在取得进展;

{
  "[test2]": {
    "host1": {}, 
    "host2": {}
  }, 
  "[test3]": {
    "host3": {}
  }, 
  "[test]": {
    "host4": {}, 
    "host5": {}
  }    
}

1 个答案:

答案 0 :(得分:1)

它可以帮到你。

import json
both = {}
start = '['
end = ']'
with open(filename, "r") as f:
    line = f.readline().strip()
    while line:
        if start in line or end in line:
           line = line.split(start)[1].split(end)[0]
        both[line] = line
        line = f.readline().strip()
json_dict = {'all': [both]}

print(json.dumps(json_dict))