60

Python でデータを JSON にエンコードしようとしていますが、かなりのトラブルが発生しています。問題は単なる誤解だと思います。

私は Python に比較的慣れておらず、さまざまな Python データ型に慣れていないため、おそらくそれが私を混乱させている原因です。

現在、リストを宣言し、別のリストをループして、あるリストを別のリストに追加しています。

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 モジュールがわかりません
  • 不適切なデータ型を使用しています。
4

7 に答える 7

74

Pythonlistsは JSON に変換しますarrays。提供されるのは、Javascript アプリケーションで使用できる完全に有効な JSON 文字列です。期待したものを得るには、次を使用する必要がありますdict

>>> json.dumps({'apple': 'cat', 'banana':'dog', 'pear':'fish'})
'{"pear": "fish", "apple": "cat", "banana": "dog"}'
于 2009-06-11T21:41:16.277 に答える
27

あなたは単にダンプロードを交換していると思います。

>>> 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
于 2009-06-11T23:07:36.930 に答える
17

(またはPython 2.6 以降simplejsonのライブラリ) では、JSON 文字列を取得して Python データ構造を返し、Python データ構造を取得して JSON 文字列を返します。JSON 文字列はオブジェクトだけでなく Javascript 配列をエンコードでき、Python リストは配列をエンコードする JSON 文字列に対応します。次のような JSON 文字列を取得するにはjsonloadsdumps

{"apple":"cat", "banana":"dog"}

渡す Python オブジェクトは次のjson.dumpsようになります。

dict(apple="cat", banana="dog")

ただし、JSON 文字列は同じ の有効な Python 構文でもありますdict。ただし、あなたが期待している特定の文字列は、単に無効な JSON 構文であると思います。

于 2009-06-11T21:41:48.337 に答える
4

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

www.json.org から:

JSON は、次の 2 つの構造で構築されています。

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

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

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

于 2009-06-11T21:41:11.300 に答える
3

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 ではありません。あ

于 2009-06-11T21:45:40.697 に答える
3

したがって、 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であり、オブジェクトとして出てきます。

于 2009-06-11T21:46:21.443 に答える
3

試す:

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

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

于 2009-06-11T21:46:39.480 に答える