我们如何将字符串转换为json

时间:2015-11-04 09:29:10

标签: python json

我想将ansible-init文件转换为json。所以,我只使用这段代码: common_shared 文件:

 [sql]
 x.com
 [yps_db]
 y.com
 [ems_db]
 c.com
 [scc_db]
 d.com

 [all:vars]
 server_url="http://x.com/x"
 app_host=abc.com
 server_url="https://x.com"

 [haproxy]
 1.1.1.1    manual_hostname=abc instance_id=i-dddd
 2.2.2.2     manual_hostname=xyz instance_id=i-cccc

用于在JSON中转换Ansible INI文件:

 import json

 options= {} 
 f = open('common_shared')
 x = f.read()
 config_entries = x.split()
 for key,value in zip(config_entries[0::2], config_entries[1::2]):
  cleaned_key = key.replace("[",'').replace("]",'')
  options[cleaned_key]=value

  print json.dumps(options,indent=4,ensure_ascii=False)

但它会打印出这个结果:

{
"scc_db": "xxx", 
"haproxy": "x.x.x.x", 
"manual_hostname=xxx": "instance_id=xx", 
"ems_db": "xxx", 
"yps_db": "xxx", 
"all:vars": "yps_server_url=\"xxx\"", 
"1.1.1.5": "manual_hostname=xxx", 
"sql": "xxx", 
"xxx": "scc_server_url=xxxx\""
}

但我想以适当的JSON格式打印结果,但无法理解如何。我尝试了配置解析器,但没有得到帮助,以所需的格式打印它。

2 个答案:

答案 0 :(得分:2)

您可以使用ConfigParser读取文件,然后转换为dict转储。

from ConfigParser import ConfigParser
from collections import defaultdict

config = ConfigParser()
config.readfp(open('/path/to/file.ini'))

def convert_to_dict(config):
    config_dict = defaultdict(dict)
    for section in config.sections():
        for key, value in config.items(section):
            config_dict[section][key] = value

    return config_dict

print convert_to_dict(config)

修改

正如您在评论中所述,某些订单项只是“事情”。没有价值,下面的内容可能适合你。

import re
from collections import defaultdict

SECTION_HEADER_RE = re.compile('^\[.*\]$')
KEY_VALUE_RE = re.compile('^.*=.*$')

def convert_ansible_to_dict(filepath_and_name):
    ansible_dict = defaultdict(dict)
    with open(filepath_and_name) as input_file:
        section_header = None
        for line in input_file:
            if SECTION_HEADER_RE.findall(line.strip()):
                section_header = SECTION_HEADER_RE.findall(line.strip())[0]
            elif KEY_VALUE_RE.findall(line.strip()):
                if section_header:
                    # Make sure you have had a header section prior to the line
                    key, value = KEY_VALUE_RE.findall(line.strip())[0].split('=', 1)
                    ansible_dict[section_header][key] = value
            else:
                if line.strip() and section_header:
                    # As they're just attributes without value, assign the value None
                    ansible_dict[section_header][line.strip()] = None

    return ansible_dict

这是一种天真的方法,可能无法捕捉到所有角落的情况,但也许它是朝着正确方向迈出的一步。如果您有任何&n-属性'在你的第一个标题之前,它们不会被包含在字典中,因为它不知道在哪里分配它,而key=value对的正则表达式假设只有 1 等于该行中的符号。我确定可能还有很多其他我现在没有看到的情况,但希望这会有所帮助。

答案 1 :(得分:0)

克里斯蒂安的答案是正确答案:使用ConfigParser。 他的解决方案的问题是您的INI文件格式不正确。

您需要将所有属性更改为:

键=值
key:value

e.g。
[SQL]
aaaaaa:是的

https://wiki.python.org/moin/ConfigParserExamples

https://en.wikipedia.org/wiki/INI_file#Keys_.28properties.29