web-dev-qa-db-fra.com

Convertir une liste en objets json

J'ai un énorme fichier texte.

line 1
line 2
line 3
...

Je l'ai converti en un tableau de listes:

[['String 1'],['String 2'],['String 3'],['String 4'],['String 5'],
['String 6'],['String 7'],['String 8'],['String 9'],['String 9'],
['String 10'], ...]

Je souhaite convertir cette liste en objets JSON, comme ceci:

[{'title1': 'String 1', 'title2': 'String 2', ... , 'title7': 'String 7'},
 {'title1': 'String 8', ..., 'title7': 'String 14'}, ...]

Je ne sais pas comment le faire. De l'aide.?

4
ahmadhas

En ajoutant simplement à la réponse de alexce, vous pouvez facilement convertir les données restructurées en JSON:

import json
json.dumps(result)

Il existe quelques problèmes de sécurité potentiels avec les tableaux de niveau supérieur. Je ne sais pas s'ils sont toujours valables avec les navigateurs modernes, mais vous pouvez envisager de l'envelopper dans un objet.

import json
json.dumps({'results': result})
6
ngraves

Pour résoudre ce problème, vous devez scinder la liste des entrées en morceaux, par 7 dans votre cas. Pour cela, utilisons cette approche . Ensuite, utilisez un list comprehension produisant une liste de dictionnaires:

>>> from pprint import pprint
>>> l = [['String 1'],['String 2'],['String 3'],['String 4'],['String 5'],
... ['String 6'],['String 7'],['String 8'],['String 9'],['String 10'],
... ['String 11']]
>>> def chunks(l, n):
...     """Yield successive n-sized chunks from l."""
...     for i in range(0, len(l), n):
...         yield l[i:i+n]
... 
>>>
>>> result = [{"title%d" % (i+1): chunk[i][0] for i in range(len(chunk))} 
              for chunk in chunks(l, 7)]
>>> pprint(result)
[{'title1': 'String 1',
  'title2': 'String 2',
  'title3': 'String 3',
  'title4': 'String 4',
  'title5': 'String 5',
  'title6': 'String 6',
  'title7': 'String 7'},
 {'title1': 'String 8',
  'title2': 'String 9',
  'title3': 'String 10',
  'title4': 'String 11'}]
4
alecxe

Comme @alecxe l'a souligné, vous devez diviser le tableau de listes que vous avez obtenu à partir du fichier en groupes de valeurs comportant 7 éléments ou moins. Vous pouvez ensuite prendre une liste des 7 titres de votre choix et les utiliser comme clés pour créer le dictionnaire de chaque objet json de la liste finale.

try:
    from itertools import izip
except ImportError:  # Python 3
    izip = Zip

try:
    xrange
except NameError:  # Python 3
    xrange = range

def grouper(n, sequence):
    for i in xrange(0, len(sequence), n):
        yield sequence[i:i+n]

data = [['String 1'],['String 2'],['String 3'],['String 4'],['String 5'],
        ['String 6'],['String 7'],['String 8'],['String 9'],['String 9'],
        ['String 10']]

titles = ['title1', 'title2', 'title3', 'title4', 'title5', 'title6', 'title7']

values = [e[0] for g in grouper(7, data) for e in g]
keys = (titles[i%7] for i in xrange(len(values)))

objs = [dict(g) for g in grouper(7, list(izip(keys, values)))]
print(objs)

Sortie:

[{'title1': 'String 1', 'title2': 'String 2', 'title3': 'String 3',
  'title4': 'String 4', 'title5': 'String 5', 'title6': 'String 6',
  'title7': 'String 7'}, {'title1': 'String 8', 'title2': 'String 9',
  'title3': 'String 9', 'title4': 'String 10'}]
1
martineau

Définissez une classe en tant que type personnalisé avant la sérialisation. Puis définissez ceci dans une boucle de la classe principale et retournez à l'aide de json.dumps ()

import json

class CustomType:
    def __init__(self, title, text):
        self.title = title
        self.text = text

    def toJSON(self):
        '''
        Serialize the object custom object
        '''
        return json.dumps(self, default=lambda o: o.__dict__, sort_keys=True, indent=4)

en classe principale:

def get_json_data():
    '''
    Convert string array to json array
    '''
    result = []
    for item in data:
        obj = CustomType("title(n)",item)
        result.append(json.loads(obj.toJSON()))

    return json.dumps(result)
0
bazo