私はPython 2を使用して、 ASCII でエンコードされたテキスト ファイルから JSON を解析しています。
これらのファイルをjson
またはsimplejson
すべての文字列値は、文字列オブジェクトではなく Unicode オブジェクトにキャストされます。問題は、文字列オブジェクトのみを受け入れるライブラリでデータを使用する必要があることです。ライブラリを変更したり更新したりすることはできません。
Unicode オブジェクトの代わりに文字列オブジェクトを取得することは可能ですか?
例
>>> import json
>>> original_list = ['a', 'b']
>>> json_list = json.dumps(original_list)
>>> json_list
'["a", "b"]'
>>> new_list = json.loads(json_list)
>>> new_list
[u'a', u'b'] # I want these to be of type `str`, not `unicode`
(2017 年の簡単でクリーンな解決策の 1 つは、Python の最新バージョン (つまりPython 3以降) を使用することです。)
ベストアンサー1
ここに良い答えがいくつかありましたが、私は最終的にpyYAML とはJSONファイルを解析するには、キーと値を型str
ではなく文字列型として渡す必要がありますunicode
。JSONはヤム、それはうまく機能します:
>>> import json
>>> import yaml
>>> list_org = ['a', 'b']
>>> list_dump = json.dumps(list_org)
>>> list_dump
'["a", "b"]'
>>> json.loads(list_dump)
[u'a', u'b']
>>> yaml.safe_load(list_dump)
['a', 'b']
ノート
ただし、いくつか注意すべき点があります:
すべてのエントリがASCII でエンコードされているため、文字列オブジェクトが取得されます。Unicode でエンコードされたエントリを使用する場合は、 Unicode オブジェクトとして返されます。変換は行われません。
PyYAML の関数を (おそらく常に) 使用する必要があります
safe_load
。JSON ファイルをロードするために使用する場合は、関数の「追加の機能」は必要ありませんload
。1.2バージョンの仕様をよりサポートするYAMLパーサーが必要な場合は(そして非常に低い数値を正しく解析する) 試すルアメルYAML:テストに必要なのはこれだけでした
pip install ruamel.yaml
。import ruamel.yaml as yaml
変換
述べたように、変換はありません。ASCII 値のみを扱うかどうか確信が持てない場合 (ほとんどの場合確信が持てません)、変換関数を使用する方がよいでしょう。
私はそれを使ったマーク・アメリーより数回試しましたが、うまく機能し、非常に使いやすいです。 代わりに同様の関数を使用することもできます。object_hook
大きなファイルでパフォーマンスが向上する可能性があります。 もう少し複雑なものを参照してください。ミレック・ミスクフからの回答そのために。