web-dev-qa-db-ja.com

Python JSONエンコーディング

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

だから私は:

  • JSON構文がわかりません
  • PythonのJSONモジュールがわかりません
  • 不適切なデータ型を使用しています。
51

Python listsはJSON arraysに変換します。それがあなたに与えているのは、Javascriptアプリケーションで使用できる完全に有効なJSON文字列です。期待したものを取得するには、dictを使用する必要があります。

>>> json.dumps({'Apple': 'cat', 'banana':'dog', 'pear':'fish'})
'{"pear": "fish", "Apple": "cat", "banana": "dog"}'
67

単にdumpsloadsを交換していると思います。

>>> 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
20
Mapio

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構文であると思います。

17
Alex Martelli

エンコードするデータはキーレス配列であるため、JSONは[]ブラケットでエンコードします。詳細については、www.json.orgを参照してください。中括弧は、キー/値のペアを持つリストに使用されます。

Www.json.orgから:

JSONは2つの構造で構築されます。

名前/値のペアのコレクション。さまざまな言語では、これはオブジェクト、レコード、構造体、辞書、ハッシュテーブル、キー付きリスト、または連想配列として実現されます。値の順序付きリスト。ほとんどの言語では、これは配列、ベクトル、リスト、またはシーケンスとして実現されます。

オブジェクトは、名前と値のペアの順序付けられていないセットです。オブジェクトは{(左中括弧)で始まり、}(右中括弧)で終わります。各名前の後には:(コロン)が続き、名前と値のペアは、(コンマ)で区切られます。

配列は、順序付けされた値のコレクションです。配列は[(左角括弧)で始まり、](右角括弧)で終わります。値は、(コンマ)で区切られます。

4
ylebre

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

3
Javier

そのため、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がオブジェクトとして出力されます。

3
emeryc

試してください:

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

注:パオロの答えに基づいています。

3
Tom Leys