-1

我有一个需要转换为 json 字典的 python 列表列表。名单如下:

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

  ]
}

所以基本上,它将是一个包含子列表的字典,每个子列表都有一个字典。如何用我所拥有的来实现?

更新:

因此,为了清楚起见,让我将其分解为几个步骤。我需要这样的数据结构(我正在转储到 .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 对象查看。我希望这会澄清。你们有什么建议?

4

2 回答 2

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 编码的字符串。这很难做到,而且完全没有必要。只需构造您想要的对象,然后调用json.dumps它。只要有可能,操作对象,而不是它们的字符串表示。
  • encode一路上你正在处理几十个字符串(并且遗漏了其中一些!),而不是仅仅建立一个大的结果字符串并调用encode一次。另外,你调用的字符串encodestr字节字符串,而不是unicode字符串,所以它甚至没有意义。最后,json.dumps更喜欢unicode字符串(并为您进行编码),因此您根本不需要这样做。一般来说,编码和解码尽可能靠近边缘,而不是整个代码。
  • 您正在尝试创建两个复杂的并行数据结构,然后将它们压缩在一起,而您本来可以将输入压缩在一起。如果最后你无法弄清楚如何将事情拼凑在一起,那么你可能在中间使用了错误的数据结构。
  • 当有完美的好方法来做同样的事情时,您正在使用已弃用和未记录的功能,例如compiler.ast.flatten和功能 - 尽管它们实际上在这里并不是必需的。除非您确实需要使用 Python 1.5,否则不要编写 Python 1.5 代码。mapNone

这是编写代码的一种更简单的方法:

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 化处理。)

于 2013-08-07T21:04:21.077 回答
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"}]'
于 2013-08-07T21:11:52.957 回答