Converting str to dict in python

后端 未结 2 1171
囚心锁ツ
囚心锁ツ 2020-12-21 06:50

I got this from a process\'s output using subprocess.Popen() :

    { about: \'RRDtool xport JSON output\',
  meta: {
    start: 1401778440,
    step: 60,
            


        
相关标签:
2条回答
  • 2020-12-21 07:08

    Indeed, older versions of rddtool export ECMA-script, not JSON. According to this debian bug report upgrading 1.4.8 should give you proper JSON. Also see the project CHANGELOG:

    JSON output of xport is now actually json compilant by its keys being properly quoted now.

    If you cannot upgrade, you have two options here; either attempt to reformat to apply quoting the object key identifiers, or use a parser that's more lenient and parses ECMA-script object notation.

    The latter can be done with the external demjson library:

    >>> import demjson
    >>> demjson.decode('''\
    ... { about: 'RRDtool xport JSON output',
    ...   meta: {
    ...     start: 1401778440,
    ...     step: 60,
    ...     end: 1401778440,
    ...     legend: [
    ...       'rta_MIN',
    ...       'rta_MAX',
    ...       'rta_AVERAGE'
    ...           ]
    ...      },
    ...   data: [
    ...     [ null, null, null ],
    ...     [ null, null, null ],
    ...     [ null, null, null ],
    ...     [ null, null, null ],
    ...     [ null, null, null ],
    ...     [ null, null, null  ]
    ...   ]
    ... }''')
    {u'about': u'RRDtool xport JSON output', u'meta': {u'start': 1401778440, u'step': 60, u'end': 1401778440, u'legend': [u'rta_MIN', u'rta_MAX', u'rta_AVERAGE']}, u'data': [[None, None, None], [None, None, None], [None, None, None], [None, None, None], [None, None, None], [None, None, None]]}
    

    Repairing can be done using a regular expression; I am going to assume that all identifiers are on a new line or directly after the opening { curly brace. Single quotes in the list will have to be changed to double quotes; this will only work if there are no embedded single quotes in the values too:

    import re
    import json
    
    yourtext = re.sub(r'(?:^|(?<={))\s*(\w+)(?=:)', r' "\1"', yourtext, flags=re.M)
    yourtext = re.sub(r"'", r'"', yourtext)
    data = json.loads(yourtext)
    
    0 讨论(0)
  • 2020-12-21 07:13

    It is indeed not valid JSON. It is, however, valid YAML, so the third-party PyYAML library might help you out:

    >>> import yaml
    >>> yaml.load(text)
    {
        'about': 'RRDtool xport JSON output',
        'meta': {
            'start': 1401778440,
            'step': 60,
            'end': 1401778440,
            'legend': [
                'rta_MIN',
                'rta_MAX',
                'rta_AVERAGE'
            ]
        },
        'data': [
            [None, None, None],
            [None, None, None],
            [None, None, None],
            [None, None, None],
            [None, None, None],
            [None, None, None]
        ]
    }
    
    0 讨论(0)
提交回复
热议问题