PythonでJSONにデータをエンコードしようとしていますが、かなりのトラブルに見舞われています。問題は単に誤解だと思います。
私は比較的Pythonであり、さまざまなPythonデータ型に精通していません。
現在、リストを宣言し、ループして別のリストを作成し、1つのリストを別のリストに追加しています。
import simplejson, json
data = [['Apple', 'cat'], ['banana', 'dog'], ['pear', 'fish']]
x = simplejson.loads(data)
# >>> typeError: expected string or buffer..
x = simplejson.dumps(stream)
# >>> [["Apple", "cat"], ["banana", "dog"], ["pear", "fish"]]
# - shouldn't JSON encoded strings be like: {{"Apple":{"cat"},{"banana":"dog"}}
だから私は:
Python lists
はJSON arrays
に変換します。それがあなたに与えているのは、Javascriptアプリケーションで使用できる完全に有効なJSON文字列です。期待したものを取得するには、dict
を使用する必要があります。
>>> json.dumps({'Apple': 'cat', 'banana':'dog', 'pear':'fish'})
'{"pear": "fish", "Apple": "cat", "banana": "dog"}'
単にdumpsとloadsを交換していると思います。
>>> import json
>>> data = [['Apple', 'cat'], ['banana', 'dog'], ['pear', 'fish']]
最初は(JSONエンコードされた)文字列としてそのデータ引数を返します:
>>> encoded_str = json.dumps( data )
>>> encoded_str
'[["Apple", "cat"], ["banana", "dog"], ["pear", "fish"]]'
2番目は逆の処理を行い、その(JSONエンコードされた)文字列引数に対応するデータを返します。
>>> decoded_data = json.loads( encoded_str )
>>> decoded_data
[[u'Apple', u'cat'], [u'banana', u'dog'], [u'pear', u'fish']]
>>> decoded_data == data
True
simplejson
(またはPython 2.6以降のライブラリjson
)では、loads
はJSON文字列を受け取り、Pythonデータ構造を返します。dumps
はPythonデータ構造を取り、JSON文字列を返します。 JSON文字列はオブジェクトだけでなくJavascript配列をエンコードでき、Pythonリストは配列をエンコードするJSON文字列に対応します。次のようなJSON文字列を取得するには
{"Apple":"cat", "banana":"dog"}
json.dumps
に渡すPythonオブジェクトは次のようになります。
dict(Apple="cat", banana="dog")
ただし、JSON文字列は、同じdict
に対して有効なPython構文でもあります。ただし、期待する特定の文字列は、単に無効なJSON構文であると思います。
エンコードするデータはキーレス配列であるため、JSONは[]ブラケットでエンコードします。詳細については、www.json.orgを参照してください。中括弧は、キー/値のペアを持つリストに使用されます。
Www.json.orgから:
JSONは2つの構造で構築されます。
名前/値のペアのコレクション。さまざまな言語では、これはオブジェクト、レコード、構造体、辞書、ハッシュテーブル、キー付きリスト、または連想配列として実現されます。値の順序付きリスト。ほとんどの言語では、これは配列、ベクトル、リスト、またはシーケンスとして実現されます。
オブジェクトは、名前と値のペアの順序付けられていないセットです。オブジェクトは{(左中括弧)で始まり、}(右中括弧)で終わります。各名前の後には:(コロン)が続き、名前と値のペアは、(コンマ)で区切られます。
配列は、順序付けされた値のコレクションです。配列は[(左角括弧)で始まり、](右角括弧)で終わります。値は、(コンマ)で区切られます。
JSONはリストに角括弧を使用します([ "one", "two", "three" ]
)およびキー/値辞書(JavaScriptではオブジェクトとも呼ばれる、{"one":1, "two":"b"}
)。
ダンプは非常に正しく、3つの要素のリストを取得します。各要素は2つの文字列のリストです。
辞書が必要な場合は、次のようになります。
x = simplejson.dumps(dict(data))
>>> {"pear": "fish", "Apple": "cat", "banana": "dog"}
予想される文字列( '{{"Apple":{"cat"},{"banana":"dog"}}
')は有効なJSONではありません。 A
そのため、simplejson.loadsはjson文字列を受け取り、データ構造を返します。そのため、そこで型エラーが発生します。
simplejson.dumps(data)が戻ってきます
'[["Apple", "cat"], ["banana", "dog"], ["pear", "fish"]]'
これはjson配列です。これは、これにpython配列を与えたためです。
「オブジェクト」タイプの構文を取得する場合は、代わりに実行します
>>> data2 = {'Apple':'cat', 'banana':'dog', 'pear':'fish'}
>>> simplejson.dumps(data2)
'{"pear": "fish", "Apple": "cat", "banana": "dog"}'
javascriptがオブジェクトとして出力されます。
試してください:
import simplejson
data = {'Apple': 'cat', 'banana':'dog', 'pear':'fish'}
data_json = "{'Apple': 'cat', 'banana':'dog', 'pear':'fish'}"
simplejson.loads(data_json) # outputs data
simplejson.dumps(data) # outputs data_joon
注:パオロの答えに基づいています。