2011-01-18 39 views
9

Tôi có tệp cấu hình trong JSON có chứa một vài biến dưới dạng chuỗi (luôn là ascii). Các chuỗi này được giải mã thành unicode theo mặc định, nhưng vì tôi phải chuyển các biến này cho các phần mở rộng của Python C, tôi cần chúng như các chuỗi Python bình thường. Tại thời điểm này tôi đang sử dụng str(unicode) để chuyển đổi các chuỗi JSON nhưng một giải pháp thanh lịch hơn và ít chi tiết hơn sẽ được đánh giá cao.Làm thế nào để giải mã JSON thành str và không phải unicode trong Python (2.6)?

Có cách nào để thay đổi bản dịch mặc định từ chuỗi thành unicode bằng tùy chỉnh JSONDecoder hoặc móc đối tượng không?

+0

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ô. –

+0

@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

+0

@TryPyPy: Không có thứ gì như các hằng số riêng của mô-đun trong Python ... –

Trả lời

0

Xem câu trả lời cho this question có giúp bạn không (trong câu hỏi mà người hỏi đang sử dụng simplejson).

1

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)) 
+0

Cảm ơn câu trả lời chi tiết. Tôi nhận ra rằng những gì tôi muốn không được hỗ trợ vì một lý do, vì vậy tôi sẽ dính vào giải pháp str (unicode). – Adrian

+0

Xin lỗi vì đã làm bạn sợ, Lennart đã làm cho tôi nhận ra rằng bạn sẽ dễ dàng hơn để có được những gì bạn muốn. – TryPyPy

Các vấn đề liên quan