2013-04-26 13 views
8

Có vẻ như họ đang hành xử chính xác theo cùng một cách.Sự khác biệt giữa json.dumps/tải và tornado.escape.json_encode/json_decode là gì?

>>> data 
[('a', 'b'), {'a': 1, 'b': 2}, ['a', 'b'], 'a', 'b'] 
>>> json.dumps(data) 
'[["a", "b"], {"a": 1, "b": 2}, ["a", "b"], "a", "b"]' 
>>> tornado.escape.json_encode(data) 
'[["a", "b"], {"a": 1, "b": 2}, ["a", "b"], "a", "b"]' 
>>> json.loads(json.dumps(data)) 
[[u'a', u'b'], {u'a': 1, u'b': 2}, [u'a', u'b'], u'a', u'b'] 
>>> tornado.escape.json_decode(json.dumps(data)) 
[[u'a', u'b'], {u'a': 1, u'b': 2}, [u'a', u'b'], u'a', u'b'] 

Trả lời

13

Đôi khi nó là hữu ích để đọc the source code:

def json_encode(value): 
    return json.dumps(value).replace("</", "<\\/") 

def json_decode(value): 
    return json.loads(to_basestring(value)) 

def to_basestring(value): 
    if isinstance(value, _BASESTRING_TYPES): 
     return value 
    assert isinstance(value, bytes_type) 
    return value.decode("utf-8") 

to_basestring chủ yếu cần thiết cho python 3.x để đảm bảo value đã gõ str, không bytes, vì json.loads không thể đối phó với cái sau .