diff --git a/Lib/json/encoder.py b/Lib/json/encoder.py --- a/Lib/json/encoder.py +++ b/Lib/json/encoder.py @@ -298,7 +298,7 @@ elif value is False: yield buf + 'false' elif isinstance(value, int): - yield buf + str(value) + yield buf + str(int(value)) elif isinstance(value, float): yield buf + _floatstr(value) else: @@ -354,7 +354,7 @@ elif key is None: key = 'null' elif isinstance(key, int): - key = str(key) + key = str(int(key)) elif _skipkeys: continue else: diff --git a/Modules/_json.c b/Modules/_json.c --- a/Modules/_json.c +++ b/Modules/_json.c @@ -1366,9 +1366,15 @@ return _steal_accumulate(acc, encoded); } else if (PyLong_Check(obj)) { - PyObject *encoded = PyObject_Str(obj); - if (encoded == NULL) + PyObject *encoded; + PyObject *longobj = PyNumber_Long(obj); + if (longobj == NULL) + return -1; + encoded = PyObject_Str(longobj); + if (encoded == NULL) { + Py_DECREF(longobj); return -1; + } return _steal_accumulate(acc, encoded); } else if (PyFloat_Check(obj)) { @@ -1551,9 +1557,14 @@ goto bail; } else if (PyLong_Check(key)) { - kstr = PyObject_Str(key); - if (kstr == NULL) + PyObject *longobj = PyNumber_Long(key); + if (longobj == NULL) + goto bail; + kstr = PyObject_Str(longobj); + if (kstr == NULL) { + Py_DECREF(longobj); goto bail; + } } else if (skipkeys) { Py_DECREF(item);