Skip to content

Instantly share code, notes, and snippets.

@ivanalejandro0
Created June 12, 2014 22:16
Show Gist options
  • Save ivanalejandro0/0d0b1370561fff25a949 to your computer and use it in GitHub Desktop.
Save ivanalejandro0/0d0b1370561fff25a949 to your computer and use it in GitHub Desktop.
Python stdlib's json.loads() vs simplejson.loads()
#!/usr/bin/env python
# encoding: utf-8
# I was getting different results on json.loads() depending if I was using
# stdlib's json or simplejson. So after a little research I reached a
# conclusion:
# `simplejson` optimizes(*) the `loads` and returns `str` when is possible,
# otherwise it returns `unicode`.
# stdlib's `json`'s `loads` returns always `unicode`.
# (*) see https://code.google.com/p/simplejson/issues/detail?id=40
import json
import simplejson
def serialize_comparison():
data_str = {'name': 'áşđ', 'name2': 'asd'}
data_unicode = {'name': u'áşđ', 'name2': u'asd'}
print "data_str: {0!r}".format(data_str)
print "data_unicode: {0!r}".format(data_unicode)
print
try:
data_str_json = json.dumps(data_str)
data_unicode_json = json.dumps(data_unicode)
data_str_simplejson = simplejson.dumps(data_str)
data_unicode_simplejson = simplejson.dumps(data_unicode)
except Exception as e:
msg = ("Error serializing data into JSON. Exception: {0}")
print msg.format(e)
raise
print "json/simplejson .dumps:"
print "data_str_json: {0!r}".format(data_str_json)
print "data_str_simplejson: {0!r}".format(data_str_simplejson)
print "data_unicode_json: {0!r}".format(data_unicode_json)
print "data_unicode_simplejson: {0!r}".format(data_unicode_simplejson)
print
data_str = json.loads(data_str_json)
data_unicode = json.loads(data_unicode_json)
print "json.loads:"
print "data_str: {0!r}".format(data_str)
print "data_unicode: {0!r}".format(data_unicode)
print
data_str = simplejson.loads(data_str_json)
data_unicode = simplejson.loads(data_unicode_json)
print "simplejson.loads:"
print "data_str: {0!r}".format(data_str)
print "data_unicode: {0!r}".format(data_unicode)
if __name__ == '__main__':
serialize_comparison()
@ivanalejandro0
Copy link
Author

Output:

data_str:     {'name2': 'asd', 'name': '\xc3\xa1\xc5\x9f\xc4\x91'}
data_unicode: {'name2': u'asd', 'name': u'\xe1\u015f\u0111'}

json/simplejson .dumps:
data_str_json:           '{"name2": "asd", "name": "\\u00e1\\u015f\\u0111"}'
data_str_simplejson:     '{"name2": "asd", "name": "\\u00e1\\u015f\\u0111"}'
data_unicode_json:       '{"name2": "asd", "name": "\\u00e1\\u015f\\u0111"}'
data_unicode_simplejson: '{"name2": "asd", "name": "\\u00e1\\u015f\\u0111"}'

json.loads:
data_str:     {u'name2': u'asd', u'name': u'\xe1\u015f\u0111'}
data_unicode: {u'name2': u'asd', u'name': u'\xe1\u015f\u0111'}

simplejson.loads:
data_str:     {'name2': 'asd', 'name': u'\xe1\u015f\u0111'}
data_unicode: {'name2': 'asd', 'name': u'\xe1\u015f\u0111'}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment