JSONからUnicodeではなく文字列オブジェクトを取得する方法 質問する

JSONからUnicodeではなく文字列オブジェクトを取得する方法 質問する

私は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.yamlimport ruamel.yaml as yaml

変換

述べたように、変換はありません。ASCII 値のみを扱うかどうか確信が持てない場合 (ほとんどの場合確信が持てません)、変換関数を使用する方がよいでしょ

私はそれを使ったマーク・アメリーより数回試しましたが、うまく機能し、非常に使いやすいです。 代わりに同様の関数を使用することもできます。object_hook大きなファイルでパフォーマンスが向上する可能性があります。 もう少し複雑なものを参照してください。ミレック・ミスクフからの回答そのために。

おすすめ記事