2016-06-06 5 views
4

Ich habe eine große Textdatei.Konvertieren Sie eine Liste in JSON-Objekte

line 1 
line 2 
line 3 
... 

ich habe es in einer Reihe von Listen umgewandelt:

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

Ich möchte diese Liste zu JSON-Objekte konvertieren, wie folgt aus:

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

Ich bin nicht sicher, wie man TU es. Irgendeine Hilfe.?

+0

Mögliches Duplikat [Konvertieren String in JSON mit Python] (http://stackoverflow.com/questions/4528099/convert-string-to-json-using-python) –

+1

Nein, es ist kein Duplikat davon. – ahmadhas

Antwort

3

Um dies zu lösen, müssen Sie teilen die Eingangsliste in Stücke, um 7 in Ihrem Fall. Verwenden Sie dazu this approach. Verwenden Sie dann eine Liste Verständnis eine Liste der Wörterbücher Herstellung:

>>> 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'}] 
+0

Wenn ich mehrere Titel (z. B. "title", "convert", "json", ...) möchte, statt title1, ttitle2, ... incumnting. – ahmadhas

+1

@ahmadhas tut mir leid und beantwortet die Frage, die gestellt wurde. – alecxe

6

gerade hinzufügen, auf alexce Antwort, können Sie leicht die umstrukturierten Daten in JSON umwandeln:

import json 
json.dumps(result) 

Es gibt einige mögliche security concerns mit Top-Level-Arrays. Ich bin mir nicht sicher, ob sie mit modernen Browsern noch gültig sind, aber Sie sollten vielleicht überlegen, sie in ein Objekt zu integrieren.

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

Wie @alecxe wies darauf hin, müssen Sie das Array von Listen teilen Sie aus der Datei in Gruppen von Werten mit 7 oder weniger Elementen bekommen. Sie können dann eine Liste von 7 beliebigen Titeln erstellen und sie als Schlüssel verwenden, um das Wörterbuch jedes json-Objekts in der endgültigen Liste zu erstellen.

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) 

Ausgang:

[{'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'}] 
0

definieren eine Klasse als benutzerdefinierten Typ vor der Serialisierung. setzen diese dann in einer Schleife in der Hauptklasse und das Rück json.dumps mit()

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) 

in Hauptklasse:

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) 
Verwandte Themen