2013-04-26 6 views
8

Wygląda na to, że zachowują się dokładnie tak samo.Jaka jest różnica między json.dumps/loads i tornado.escape.json_encode/json_decode?

>>> 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'] 

Odpowiedz

13

Czasami jest to przydatne do zapoznania 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 jest najbardziej potrzebne dla Pythona 3.x do zapewnienia value ma typ str, nie bytes, ponieważ json.loads nie może uporać się z tym ostatnim .