В Python 2 функция json.dumps() гарантирует, что все символы не-ascii будут экранированы как \uxxxx.
Но разве это не сбивает с толку, потому что \uxxxx является символом юникода и должен использоваться внутри строки юникода.
Вывод json.dumps() - это str, который является байтовой строкой в Python 2. И, следовательно, он не должен вызывать символы как \xhh?
>>> unicode_string = u"\u00f8"
>>> print unicode_string
ø
>>> print json.dumps(unicode_string)
"\u00f8"
>>> unicode_string.encode("utf8")
'\xc3\xb8'