将列表转换为json对象

2024-09-23 10:20:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个巨大的文本文件。

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'}, ...]

我不知道怎么做。有什么帮助吗。?


Tags: 对象json列表stringline文本文件title2title1
3条回答

正如@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'}]

只需添加到alexce的响应中,就可以轻松地将重组后的数据转换为JSON:

import json
json.dumps(result)

顶层数组有一些潜在的security concerns。我不确定它们在现代浏览器中是否仍然有效,但您可能需要考虑将其包装为一个对象。

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

要解决这个问题,您需要将输入列表分成块,在您的情况下为7。为此,我们使用this approach。然后,使用列表理解生成字典列表:

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

相关问题 更多 >