我有一个python列表,我需要转换为json字典。清单如下:
[
['[{"name":"david","level":"k","xaxis":[[]],"yaxis":[[]],', '"count":[[2011, 6], [2012, 0], [2013, 11]]},'],
['{"name":"marshall","level":"n","xaxis":[[]],"yaxis":[[]],',
'"count":[[2008, 130], [2009, 53], [2010, 10], [2011, 17], [2012, 0], [2013, 142]]}]']
]
我需要的是:
{
[
{
"name": "david",
"level": "k",
"xaxis": [[]],
"yaxis": [[]],
"count":[[2011, 6], [2012, 0], [2013, 11]]
},
{
"name": "diana",
"level": "k",
"xaxis": [[]],
"yaxis": [[]],
"count":[[2011, 6], [2012, 0], [2013, 11]]
}
]
}
基本上,它将是一个包含子列表的字典,每个子列表都有一个字典。如何用我拥有的东西来实现它?
UPDATING:
所以,为了清楚起见,我将其分解为几个步骤。我需要数据结构是这样的(我将转储到.json文件中):
[{
"name": "David",
"level": "s",
"xaxis": [
[]
],
"yaxis": [
[]
],
"count": [
[2008, 128],
[2009, 51],
[2010, 10],
[2011, 17],
[2012, 0],
[2013, 142]
]
}, {
"name": "Diana",
"level": "v",
"xaxis": [
[]
],
"yaxis": [
[]
],
"count": [
[2008, 11],
[2009, 0],
[2010, 1],
[2011, 2],
[2012, 0],
[2013, 6]
]
}]
所以我构建它的方式如下:
首先我有两个清单 - >名称和计算:
names = ['David', 'Diana']
calculations = [[[2011, 6], [2012, 0], [2013, 11]], [[2008, 130], [2009, 53], [2010, 10], [2011, 17], [2012, 0], [2013, 142]]]
“计算”是列表清单的列表。
从这两个列表中,我创建了最初提到的结构,如下所示:
import random
from compiler.ast import flatten
names_final = []
calculations_final = []
completed = []
for a in names:
names_final.append('{"name":"'.encode('utf-8')+a.encode('utf-8')+'","level":"'.encode('utf-8')+random.choice('abcdefghijklmnopqrstuvwxyz').encode('utf-8')+'","xaxis":[[]],"yaxis":[[]],'.encode('utf-8'))
for b in calculations:
calculations_final.append('"count":'.encode('utf-8')+str(b).encode('utf-8')+'},'.encode('utf-8'))
for i,j in map(None, names_final, calculations_final):
completed.append(flatten([i,j]))
然后最后到完成的列表,我正在做以下修改,以便得到我需要的东西:
completed[0][0]='['+completed[0][0]
completed[-1][-1]= completed[-1][-1][:-1]
completed[-1][-1]=completed[-1][-1]+']'
这导致在此问题的最顶部提到的输出列表。我需要的是将它转换为一个json对象,以便它可以在浏览器上作为json对象查看,基于用户定义的查询。我希望这会澄清。你们有什么建议?
答案 0 :(得分:2)
如果您只想将JSON编码事物列表的列表转换为JSON编码事物解码的任何对象列表的列表,那很容易:
decoded = [[json.loads(value) for value in inner_list] for inner_list in outer_list]
如果你想把它变成一个大的JSON编码的东西,那也很容易:
encoded = json.dumps(decoded)
如果您还想将该外部列表转换为dict(将编码为JSON对象)......嗯,这没有意义。你不能只有一个包含列表的字典(或对象),你必须有一个字典映射键到那些列表。
最重要的是,您的输入数据甚至不是有效JSON编码事物列表的列表;它是不可解码的JSON片段列表的列表。例如,这个片段:
"count":[[2011, 6], [2012, 0], [2013, 11]]}
...不会映射到任何东西。
也许你想要的是这样的:
rejoined = ''.join(''.join(inner_list) for inner_list in outer_list)
decoded = json.loads(rejoined)
那会给你这个:
[{'count': [[2011, 6], [2012, 0], [2013, 11]],
'level': 'k',
'name': 'david',
'xaxis': [[]],
'yaxis': [[]]},
{'count': [[2008, 130],
[2009, 53],
[2010, 10],
[2011, 17],
[2012, 0],
[2013, 142]],
'level': 'n',
'name': 'marshall',
'xaxis': [[]],
'yaxis': [[]]}]
然后你可以对它进行重新JSON编码,或者只是按原样使用rejoined
(因为它显然是等效的。)
现在你已经解释了一点......你在自己身上做的事情比他们需要的要困难得多。您的代码存在许多问题:
json.dumps
即可。尽可能操纵对象,而不是它们的字符串表示。encode
- 沿途有数十个字符串(并且缺少一些字符串!)而不是仅仅构建一个大的结果字符串并调用encode
一次。另外,您调用encode
的字符串是str
字节字符串,而不是unicode
字符串,因此它甚至没有意义。最后,json.dumps
更喜欢unicode
字符串(并为您编码),因此您根本不需要这样做。通常,您的编码和解码尽可能靠近边缘,而不是整个代码中的所有编码和解码。compiler.ast.flatten
和map
等已弃用和未记录的功能None
功能 - 尽管它们实际上并不是必需的无论如何这里。除非你真的需要使用Python 1.5,否则不要编写Python 1.5代码。这是编写代码的一种更简单的方法:
completed = []
for name, calculation in zip(names, calculations):
completed.append({'name': name,
'level': random.choice('abcdefghijklmnopqrstuvwxyz'),
'xaxis': [[]],
'yaxis': [[]],
'count': calculation})
result = json.dumps(completed)
现在completed
是您的数据结构,result
是该数据结构的JSON编码。你要求帮助的问题甚至没有出现。 (你可能甚至不需要result
;许多web服务/ RPC /等库让你只需传递对象并自动为它们提供JSON-ify。)
答案 1 :(得分:0)
所以看起来你有一个JSON字符串的片段,当连接在一起时将是有效的JSON,你只需要将所有字符串连接在一起并将结果传递给json.loads()
:
data = [['[{"name":"david","level":"k","xaxis":[[]],"yaxis":[[]],',
'"count":[[2011, 6], [2012, 0], [2013, 11]]},'],
['{"name":"marshall","level":"n","xaxis":[[]],"yaxis":[[]],',
'"count":[[2008, 130], [2009, 53], [2010, 10], [2011, 17], [2012, 0], [2013, 142]]}]']
]
>>> decoded = json.loads(''.join(''.join(piece) for piece in data))
>>> pprint.pprint(decoded)
[{'count': [[2011, 6], [2012, 0], [2013, 11]],
'level': 'k',
'name': 'david',
'xaxis': [[]],
'yaxis': [[]]},
{'count': [[2008, 130],
[2009, 53],
[2010, 10],
[2011, 17],
[2012, 0],
[2013, 142]],
'level': 'n',
'name': 'marshall',
'xaxis': [[]],
'yaxis': [[]]}]
此时decoded
将是包含您的数据的Python字典,如果您想将其转换为完整的JSON字符串,您只需json.dumps()
:
>>> json.dumps(decoded)
'[{"count": [[2011, 6], [2012, 0], [2013, 11]], "yaxis": [[]], "name": "david", "xaxis": [[]], "level": "k"}, {"count": [[2008, 130], [2009, 53], [2010, 10], [2011, 17], [2012, 0], [2013, 142]], "yaxis": [[]], "name": "marshall", "xaxis": [[]], "level": "n"}]'