2011-01-18 18 views
9

JSONには、文字列としてのいくつかの変数(常にascii)を含む設定ファイルがあります。これらの文字列はデフォルトでUnicodeにデコードされますが、これらの変数をPython C Extensionsに渡す必要があるので、通常のPython文字列としてそれらを必要とします。現時点では、私はstr(unicode)を使ってJSON文字列を変換していますが、より洗練された、あまり控えめな解決策は大いに評価されるでしょう。JSONをstrにデコードし、Python(2.6)でunicodeをデコードする方法はありますか?

JSONDecoderカスタムまたはオブジェクトフックを使用して、文字列からユニコードにデフォルト変換を変更する方法はありますか?

+0

はい、カスタムJSONDecoderはUnicodeにSTRからデコードをスキップすることができるはずですし、生のバイナリ文字列を返します。 –

+0

@Lennart Regebro私はそれをやろうとしましたが、失敗しました。多くのクラスとモジュールのprivate定数をコピーアンドペースト拡張する必要がありました。私が見ることができないJSONDecoderを微調整する簡単な方法はありますか? – TryPyPy

+0

@TryPyPy:Pythonのモジュールプライベート定数のようなものはありません。 –

答えて

0

this questionへの返信があなたに役立つかどうかを確認します(この質問では、質問者はsimplejsonを使用していました)。

1

速度を落としたくない場合はありません。やや遅い場合はOKですが、普通のjson.loadsを使用し、再帰的にstrに変換する方が安くて、おそらく高速であると考える必要があります。あなたがすることを意図していなかった拡張コードを経由受け入れること ひどく十分な文字列を返す loadsをしたいならば、言ったことすべてで

は、ここに一つの可能​​な結果(主にコピー-N-ペーストを通って延びる) このです私は光を見作るために、ありがとうレナート愚かだった(つまり、あなただけJSONDecoderやトリックのカップルを延長する必要があります):

import json 
from json import decoder, scanner 

from json.scanner import make_scanner 
from _json import scanstring as c_scanstring 

_CONSTANTS = json.decoder._CONSTANTS 

py_make_scanner = scanner.py_make_scanner 

# Convert from unicode to str 
def str_scanstring(*args, **kwargs): 
    result = c_scanstring(*args, **kwargs) 
    return str(result[0]), result[1] 

# Little dirty trick here 
json.decoder.scanstring = str_scanstring 

class StrJSONDecoder(decoder.JSONDecoder): 
    def __init__(self, encoding=None, object_hook=None, parse_float=None, 
      parse_int=None, parse_constant=None, strict=True, 
      object_pairs_hook=None): 
     self.encoding = encoding 
     self.object_hook = object_hook 
     self.object_pairs_hook = object_pairs_hook 
     self.parse_float = parse_float or float 
     self.parse_int = parse_int or int 
     self.parse_constant = parse_constant or _CONSTANTS.__getitem__ 
     self.strict = strict 
     self.parse_object = decoder.JSONObject 
     self.parse_array = decoder.JSONArray 
     self.parse_string = str_scanstring 
     self.scan_once = py_make_scanner(self) 

# And another little dirty trick there  
_default_decoder = StrJSONDecoder(encoding=None, object_hook=None, 
           object_pairs_hook=None) 

json._default_decoder = _default_decoder 

j = {1:'2', 1.1:[1,2,3], u'test': {12:12, 13:'o'}} 
print json.loads(json.dumps(j)) 
+0

詳細な回答ありがとうございます。私が望んでいたのは理由がサポートされていないので、str(Unicode)ソリューションに固執することになりました。 – Adrian

+0

あなたを怖がってしまって申し訳ありませんが、Lennartは自分が望むものを手に入れようとする方がはるかに簡単だと気付かせました。 – TryPyPy

関連する問題