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

したがって、私がこれを構築している方法は次のとおりです。

最初に 2 つのリストがあります -> 名前と計算:

names = ['David', 'Diana']

calculations = [[[2011, 6], [2012, 0], [2013, 11]], [[2008, 130], [2009, 53], [2010, 10], [2011, 17], [2012, 0], [2013, 142]]]

「calculations」は、リストのリストのリストです。

これら 2 つのリストから、最初に述べた構造を次のように作成しています。

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 でエンコードされた 1 つの大きなものに戻したい場合は、それも簡単です。

encoded = json.dumps(decoded)

その外側のリストを (JSON オブジェクトにエンコードされる) dict に変換したい場合も…まあ、それは意味がありません。リストを含む dict (またはオブジェクト) を持つことはできません。キーをそれらのリストにマッピングする dict が必要です。


その上、入力データは、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大きな結果文字列を構築して 1 回呼び出すのではなく、途中で何十もの文字列を処理しています (そして、いくつかの文字列を見逃しています! ) encode。さらに、呼び出しencodeているstr文字列は文字列ではなくバイト文字unicode列であるため、意味がありません。最後に、文字列をjson.dumps優先するunicode(そしてエンコードを行う) ため、これを行う必要はまったくありません。一般に、コード全体ではなく、できるだけエッジの近くでエンコードとデコードを行います。
  • 2 つの複雑な並列データ構造を作成し、それらを一緒に圧縮しようとしていますが、入力を一緒に圧縮することもできました。最後にパッチを適用する方法がわからない場合は、途中で間違ったデータ構造を使用していた可能性があります。
  • 同じことを行うための完全に良い方法がある場合に、 関数compiler.ast.flattenmap一緒にや のような非推奨で文書化されていない機能を使用していますが、実際にはここでは必要ありません。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 化できます。)

于 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 に答える