json.dumps/loads和tornado.escape.json_encode/json_decode有什么区别?

CDT*_*CDT 8 python tornado

它们似乎表现得完全一样.

>>> 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']
Run Code Online (Sandbox Code Playgroud)

gat*_*tto 15

有时阅读源代码很有用:

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")
Run Code Online (Sandbox Code Playgroud)

to_basestringpython 3.x主要需要确保value有类型str,而不是bytes,因为json.loads无法处理后者.