以下を実行すると、Pythonのjsonモジュール(2.6以降に含まれる)がint辞書のキーを文字列に変換することがわかりました。
>>> import json
>>> releases = {1: "foo-v0.1"}
>>> json.dumps(releases)
'{"1": "foo-v0.1"}'
ダンプとロード時に文字列を解析する必要なく、キーをintとして保存する簡単な方法はありますか?jsonモジュールが提供するフックを使用することは可能だと思いますが、やはりこれには解析が必要です。私が見落とした議論があるのでしょうか?乾杯、チャズ
サブ質問:回答ありがとうございます。jsonが私が恐れていたように機能するのを見て、おそらくダンプの出力を解析してキーのタイプを伝える簡単な方法はありますか?また、ダンプを実行するコードと、サーバーからjsonオブジェクトをダウンロードしてロードするコードは、どちらも私が作成したものです。
これは、さまざまなマッピングコレクションの微妙な違いの1つです。JSONはキーを文字列として扱います。Pythonは、タイプのみが異なる個別のキーをサポートしています。
Python(および明らかにLua)では、マッピング(それぞれ辞書またはテーブル)へのキーはオブジェクト参照です。Pythonでは、それらは不変の型であるか、__hash__
メソッドを実装するオブジェクトである必要があります。(Luaのドキュメントでは、可変オブジェクトの場合でもハッシュ/キーとしてオブジェクトのIDを自動的に使用し、同等の文字列が確実に同じオブジェクトにマッピングされるように文字列インターンに依存することを推奨しています)。
Perl、Javascript、awk、およびその他の多くの言語では、ハッシュ、連想配列、または指定された言語で呼び出されるもののキーは、文字列(またはPerlでは「スカラー」)です。perlに$foo{1}, $foo{1.0}, and $foo{"1"}
はすべて同じマッピングへの参照があります%foo
---キーはスカラーとして評価されます!
JSONは、Javascriptシリアル化テクノロジとして始まりました。(JSONの略J AVA S CRIPT O bject Nの otation。)当然のことながら、そのマッピングの意味と一致するそのマッピング表記のためのセマンティクスを実装します。
シリアライゼーションの両端がPythonになる場合は、ピクルスを使用したほうがよいでしょう。これらをJSONからネイティブPythonオブジェクトに変換する必要がある場合は、いくつかの選択肢があると思います。まず、(try: ... except: ...
)を試して、辞書の検索に失敗した場合に任意のキーを数値に変換できます。あるいは、もう一方の端(このJSONデータのシリアライザーまたはジェネレーター)にコードを追加すると、各キー値に対してJSONシリアル化を実行させることができます-キーのリストとしてそれらを提供します。(その後、Pythonコードは最初にキーのリストを反復処理し、それらをネイティブのPythonオブジェクトにインスタンス化/逆シリアル化します...次に、それらを使用してマッピングから値にアクセスします)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加