web-dev-qa-db-ja.com

リストをjsonオブジェクトに変換する

巨大なテキストファイルがあります。

line 1
line 2
line 3
...

私はそれをリストの配列に変換しました:

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

このリストを次のようにJSONオブジェクトに変換したいと思います。

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

どうしたらいいのか分かりません。助けて?

4
ahmadhas

Alexceの応答に追加するだけで、再構成されたデータをJSONに簡単に変換できます。

import json
json.dumps(result)

トップレベルの配列には、いくつかの潜在的な セキュリティ上の懸念 があります。最新のブラウザでも有効かどうかはわかりませんが、オブジェクトでラップすることを検討してください。

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

これを解決するには、入力リストをチャンクに分割する必要があります。これには、 このアプローチ を使用します。次に、list comprehensionを使用して、辞書のリストを作成します。

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

@alecxeが指摘したように、ファイルから取得したリストの配列を、7つ以下の要素を持つ値のグループに分割する必要があります。次に、必要な7つのタイトルのリストを取得し、それらをキーとして使用して、最終的なリスト内の各jsonオブジェクトの辞書を作成できます。

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)

出力:

[{'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

シリアル化する前に、クラスをカスタムタイプとして定義します。次に、これをメインクラスのループに設定し、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)

メインクラス:

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