Someone at work got the idea that we should use this Python JSON library called ultrajson because apparently the standard Python json library was slow, or something. Well, we did end up using it, and it turned out to be a Bad Idea.
The standard JSON library in Python, which ujson is intended to be a drop-in replacement for, handles errors in a sane and Pythonic way. For example, if you attempt to serialize something that obviously doesn’t have a reasonable JSON representation, such as a Python function:
>>> def b(): ... pass ... >>> json.dumps({'test': b}) Traceback (most recent call last): File "<stdin>", line 1, inFile "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 231, in dumps return _default_encoder.encode(obj) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 201, in encode chunks = self.iterencode(o, _one_shot=True) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 264, in iterencode return _iterencode(o, 0) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 178, in default raise TypeError(repr(o) + " is not JSON serializable") TypeError: <function b at 0x1056b3398> is not JSON serializable
TypeError, of course. The programmer immediately realizes what the problem is and how to fix it.
Let’s see what ultrajson does with, say, a Python object.
>>> class Test(object): ... def t(self): ... print "hello" ... >>> t = Test() >>> ujson.dumps({'a': t}) '{"a":{}}'
Yep, it apparently serializes a lot of things it doesn’t want to deal with as empty JSON objects. Silent failure, the king of error handling. We had a funny bug caused by this; thankfully it never made it to production.
What if I try to serialize something else? Like, say, a function?
>>> def b(): ... pass ... >>> ujson.dumps({'a': b}) Traceback (most recent call last): File "<stdin>", line 1, inOverflowError: Maximum recursion level reached
Wonderful. I hope I don’t have to explain why this stinks and how much. Please spread the word and save the world from the potential bugs caused by this terrible library.
Comments (4)
Holy crap
You’re alive
You should blog more frequently :)
you should talk for about encoding so i don’t have to talk to daiz. no one should have to talk to daiz.
I filed a bug about this, please comment there:
https://github.com/esnme/ultrajson/issues/134