web-dev-qa-db-ja.com

python json.loadsを使用してUnicode入力を解析する

PythonでJSON文字列をロードする最良の方法は何ですか?

Json.loadsを使用して、次のようにユニコードを処理したいと思います。

import json
json.loads(unicode_string_to_load)

また、 'encoding'パラメーターに値 'utf-16'を指定してみましたが、エラーは解消されませんでした。

エラーのある完全なSSCCE:

# -*- coding: utf-8 -*-
import json
value = '{"foo" : "bar"}'
print(json.loads(value)['foo'])     #This is correct, prints 'bar'

some_unicode = unicode("degradé")  
#last character is latin e with acute "\xe3\xa9"
value = '{"foo" : "' + some_unicode + '"}'
print(json.loads(value)['foo'])            #incorrect, throws error

エラー:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 
6: ordinal not in range(128)
17

'latin-1'を使用して文字列をユニコード文字列に型キャストすると、エラーが修正されました。

UnicodeDecodeError: 'utf16' codec can't decode byte 0x38 in 
position 6: truncated data

修正されたコード:

import json

ustr_to_load = unicode(str_to_load, 'latin-1')

json.loads(ustr_to_load)

そして、エラーはスローされません。

OPは(コメントで!)明確にします...:

ソースデータは、Unicodeでエンコードされた巨大な文字列です

それからあなたはそれが使う多くのユニコードエンコーディングのwhichを知る必要があります-明らかにそれは失敗したので 'utf-16'ではありませんが、他にもたくさんあります-'utf-8'、 'iso -8859-15 'など。問題が解決するまですべて試してみるか、print repr(str_to_load[:80])に表示されている内容を質問の編集として貼り付けて、私たちが推測できるようにします!-)。

6
Alex Martelli

私が見つけた最も簡単な方法は

import simplejson as json

そうすれば、コードは同じままです

json.loads(str_to_load)

参照: https://simplejson.readthedocs.org/en/latest/

5
jeremyforan

Djangoを使用すると、単純なロードの代わりにSimpleJSONを使用してロードを使用できます。

from Django.utils import simplejson

simplejson.loads(str_to_load, "utf-8")
1
Hussein Ahmed