Không nếu bạn không sẵn sàng giảm tốc độ. Nếu chậm hơn một chút là OK, bạn phải xem xét việc sử dụng đồng bằng json.loads
và chuyển đổi đệ quy thành str
có thể rẻ hơn và có thể nhanh hơn.
Với tất cả những gì đã nói, nếu bạn muốn một số loads
trả về các chuỗi quá đủ
để chấp nhận việc mở rộng mã không có nghĩa là, đây là một kết quả có thể (chủ yếu là mở rộng thông qua sao chép-n-dán)
là asinine, cảm ơn Lennart đã khiến tôi nhìn thấy ánh sáng (nghĩa là, bạn chỉ cần mở rộng JSONDecoder và một vài thủ thuật):
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))
Có, một JSONDecoder tùy chỉnh có thể bỏ qua giải mã từ str sang Unicode và trả về chuỗi nhị phân thô. –
@Lennart Regebro Tôi đã cố gắng thực hiện điều đó và không thành công: tôi phải sao chép-n-dán-mở rộng nhiều lớp và hằng số riêng của mô-đun. Có một cách đơn giản để chỉ cần tinh chỉnh JSONDecoder mà tôi không thể nhìn thấy? – TryPyPy
@TryPyPy: Không có thứ gì như các hằng số riêng của mô-đun trong Python ... –