如何在Python(2.6)中将JSON解码为str而不是unicode?

时间:2011-01-18 11:31:36

标签: python json unicode

我在JSON中有一个配置文件,其中包含一些变量作为字符串(总是ascii)。默认情况下,这些字符串被解码为unicode,但由于我必须将这些变量传递给我的Python C Extensions,我需要它们作为普通的Python字符串。目前我正在使用str(unicode)来转换JSON字符串,但是我们非常感谢更优雅,更简洁的解决方案。

有没有办法使用自定义JSONDecoder或对象挂钩将默认转换从字符串更改为unicode?

2 个答案:

答案 0 :(得分:1)

如果你不愿意失去一些速度,那就不行了。如果稍慢一点就可以了,你必须考虑使用普通json.loads并递归转换为str可能更便宜,也许更快。

尽管如此,如果你确实想要一个足够严重地返回字符串的loads 来接受通过扩展的代码,这是一个可能的结果(主要是通过copy-n扩展) -paste)这是asinine,感谢Lennart让我看到了光明(即,你只需要扩展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))

答案 1 :(得分:0)

查看对this question的回复是否对您有帮助(在该问题中,提问者正在使用simplejson)。