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

在Python(2.6)中,如何将JSON解码为str而不是unicode?,python,json,unicode,Python,Json,Unicode,我有一个JSON格式的配置文件,其中包含一些字符串形式的变量(总是ascii)。默认情况下,这些字符串被解码为unicode,但由于我必须将这些变量传递给我的PythonC扩展,所以需要将它们作为普通Python字符串。目前,我正在使用str(unicode)转换JSON字符串,但如果能提供一个更优雅、更简洁的解决方案,我将不胜感激 有没有一种方法可以使用自定义的JSONDecoder或对象挂钩将字符串的默认转换更改为unicode?查看对的响应是否有帮助(在这个问题上,提问者使用的是simpl

我有一个JSON格式的配置文件,其中包含一些字符串形式的变量(总是ascii)。默认情况下,这些字符串被解码为unicode,但由于我必须将这些变量传递给我的PythonC扩展,所以需要将它们作为普通Python字符串。目前,我正在使用
str(unicode)
转换JSON字符串,但如果能提供一个更优雅、更简洁的解决方案,我将不胜感激


有没有一种方法可以使用自定义的
JSONDecoder
或对象挂钩将字符串的默认转换更改为unicode?

查看对的响应是否有帮助(在这个问题上,提问者使用的是
simplejson

如果你不想失去一些速度,就不会。如果稍微慢一点就可以了,您必须考虑使用普通<代码> JSON.Load ,递归转换为<代码> STR 可能更便宜,也可能更快。p> 综上所述,如果你真的想要一个
加载
,它返回的字符串非常糟糕,以至于可以接受扩展不需要的代码,那么这里有一个可能的结果(主要是通过复制粘贴进行扩展),这很愚蠢,感谢Lennart让我明白了这一点(也就是说,你只需要扩展JSONDecoder和一些技巧):


是的,自定义JSONDecoder应该能够跳过从str到Unicode的解码,并返回原始二进制字符串。@Lennart Regebro我试图这么做,但失败了:我必须复制-n-paste-extend大量的类和模块私有常量。有没有一种简单的方法可以调整我看不到的JSONDecoder?@trypy:Python中没有模块私有常量……OMG。我不知道是什么样的大脑腐朽影响了我,但如果你真的看一下我下面的代码(在我让它变得更理智之前),我的行为就好像_var+都是无法穿透的。哇,谢谢你睁开我的眼睛,我无法解释这里发生了什么…:-)我看了代码,我不得不同意它很难重写…谢谢你的详细回答。我现在意识到我想要的东西不受支持是有原因的,所以我将坚持使用str(unicode)解决方案。很抱歉吓到了你,Lennart让我意识到得到你想要的东西要容易得多。
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))