[解決済み] Pythonのjsonモジュール、int型辞書のキーを文字列に変換する
質問
Pythonのjsonモジュール(2.6以降に搭載)で、以下を実行すると、int型辞書のキーが文字列に変換されることがわかりました。
>>> import json
>>> releases = {1: "foo-v0.1"}
>>> json.dumps(releases)
'{"1": "foo-v0.1"}'
ダンプやロード時に文字列をパースすることなく、キーをint型として保存する簡単な方法はないでしょうか? jsonモジュールが提供するフックを使えば可能だと思いますが、この場合もやはりパースが必要です。 私が見落としている引数があるのでしょうか? cheers, chaz
サブ質問です。 回答ありがとうございます。jsonは私が恐れていたように動作するように、多分ダンプの出力を解析することによって、キーの種類を伝える簡単な方法はありますか? また、ダンプを行うコードと、サーバーからjsonオブジェクトをダウンロードしてロードするコードは、両方とも私が書いたものであることに留意してください。
解決方法は?
これは、さまざまなマッピングコレクション間の微妙な違いの1つであり、あなたを苦しめる可能性があります。 JSONはキーを文字列として扱いますが、Pythonは型だけが異なる個別のキーをサポートします。
Pythonでは(Luaでもそうですが)、マッピング(それぞれ辞書とテーブル)のキーはオブジェクトのリファレンスです。 Pythonでは、それらはimmutable型でなければなりません。
__hash__
メソッドを使用します。 (Luaのドキュメントによると、ミュータブルなオブジェクトであっても自動的にオブジェクトのIDをハッシュ/キーとして使用し、同等の文字列が同じオブジェクトにマッピングされることを保証するために文字列インターリングに依存しているようです)。
Perl や Javascript、awk、その他多くの言語では、ハッシュや連想配列など、その言語で呼ばれるもののキーは文字列 (Perl では "scalars") です。 Perl では
$foo{1}, $foo{1.0}, and $foo{"1"}
のマッピングはすべて同じ参照です。
%foo
--- キーは
評価済み
をスカラーとして使用します。
JSONは、Javascriptのシリアライズ技術として始まりました。(JSONは J アバ S スクリプト O オブジェクト N という表記があります)。 当然ながら、マッピングの意味論と一致するマッピング記法のための意味論を実装しています。
シリアライズの両端がPythonであるなら、picklesを使った方がいいでしょう。 もし本当にJSONからPythonのネイティブオブジェクトに変換する必要があるなら、2つの選択肢があると思います。 最初に、あなたは (
try: ... except: ...
) を使って、辞書の検索に失敗した場合に、任意のキーを数値に変換することができます。 あるいは、もう一方の側(このJSONデータのシリアライザーまたはジェネレーター)にコードを追加して、各キー値に対してJSONシリアライズを実行させ、それらをキーのリストとして提供することも可能です。 (そしてPythonのコードはまずキーのリストを繰り返し、それらをPythonのネイティブオブジェクトにインスタンス化/デシリアライズし、マッピングから値にアクセスするためにそれらを使用します)。
関連
-
Pythonを使って簡単なzipファイルの解凍パスワードを手作業で解く
-
風力制御におけるKS原理を深く理解するためのpythonアルゴリズム
-
[解決済み] Pythonで辞書に新しいキーを追加するにはどうすればよいですか?
-
[解決済み] ASP.NETでJSONを単純なDictionary<string,string>にデシリアライズするにはどうすればよいですか?
-
[解決済み] 辞書からJSONへの変換
-
[解決済み] Python辞書:keys()とvalues()は常に同じ順番なのか?
-
[解決済み】Pythonで辞書のキーをリストとして返すには?
-
[解決済み】リスト内のすべての文字列をint型に変換する
-
[解決済み】JSONの文字列をリストではなく辞書に変換する方法
-
[解決済み】JSONを表現するためのRedis文字列とRedisハッシュ:効率?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み] _tkinter.TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み】ImportError: PILという名前のモジュールがない
-
[解決済み】socket.error: [Errno 48] アドレスはすでに使用中です。
-
[解決済み】 AttributeError: モジュール 'matplotlib' には属性 'plot' がない。
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み】インポートエラー。モジュール名 urllib2 がない
-
[解決済み】Python - "ValueError: not enough values to unpack (expected 2, got 1)" の修正方法 [閉店].
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない
-
[解決済み】辞書の理解でif/elseを使用するにはどうすればよいですか?