Question

J'ai obtenu ceci à partir de la sortie d'un processus utilisant subprocess.Popen() :

    { 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  ]
  ]
}

Cela ne me semble pas être un json valide.j'ai utilisé ast.literal_eval() et json.loads(), mais sans succès.Quelqu'un peut-il m'aider dans la bonne direction ?Merci d'avance.

Était-ce utile?

La solution

En effet, les anciennes versions de rddtool exporter le script ECMA, pas JSON.Selon ce rapport de bug Debian la mise à niveau 1.4.8 devrait vous donner le bon JSON.Voir aussi le projet JOURNAL DES CHANGEMENTS:

La sortie JSON de Xport est maintenant en fait JSON compilant par ses clés correctement citées maintenant.

Si vous ne pouvez pas effectuer la mise à niveau, vous avez deux options ici :soit essayez de reformater pour appliquer en citant les identifiants de clé d'objet, soit utilisez un analyseur plus indulgent et analyse la notation d'objet de script ECMA.

Cette dernière peut être réalisée avec l'extérieur demjson bibliothèque:

>>> 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]]}

La réparation peut être effectuée à l'aide d'une expression régulière ;Je vais supposer que tous les identifiants sont sur une nouvelle ligne ou directement après l'ouverture { accolade.Les guillemets simples dans la liste devront être remplacés par des guillemets doubles ;cela ne fonctionnera que s'il n'y a pas de guillemets simples incorporés dans les valeurs :

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)

Autres conseils

Ce n'est en effet pas du JSON valide.Il est cependant valable YAML, donc le tiers PyYAML la bibliothèque pourrait vous aider:

>>> 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]
    ]
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top