diff options
author | Ask Solem <ask@rabbitmq.com> | 2012-06-19 16:51:06 +0200 |
---|---|---|
committer | Ask Solem <ask@rabbitmq.com> | 2012-06-19 16:51:06 +0200 |
commit | 70ad705a2b7192e311e7123176525a6551f8453d (patch) | |
tree | 7c5d9076e40d1a96cd1d13bb246c1a4f39c1b2d7 | |
parent | b8c8c8a7076d8ecb932dad0c88e88137f6ee86e1 (diff) | |
download | anyjson-70ad705a2b7192e311e7123176525a6551f8453d.tar.gz |
Use StringIO() and load to support buffer objects
-rw-r--r-- | anyjson/__init__.py | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/anyjson/__init__.py b/anyjson/__init__.py index e7974b0..bfe1acb 100644 --- a/anyjson/__init__.py +++ b/anyjson/__init__.py @@ -17,19 +17,30 @@ __docformat__ = "restructuredtext" #: available through ``implementation.name``. implementation = None +# json.loads does not support buffer() objects, +# so we load() and StringIO instead, and it won't copy. +if sys.version_info[0] == 3: + from io import StringIO +else: + try: + from cStringIO import StringIO # noqa + except ImportError: + from StringIO import StringIO # noqa + #: List of known json modules, and the names of their loads/dumps #: methods, as well as the exceptions they throw. Exception can be either #: an exception class or a string. -_modules = [("yajl", "dumps", TypeError, "loads", ValueError), - ("jsonlib2", "write", "WriteError", "read", "ReadError"), - ("jsonlib", "write", "WriteError", "read", "ReadError"), - ("simplejson", "dumps", TypeError, "loads", ValueError), - ("json", "dumps", TypeError, "loads", ValueError), - ("django.utils.simplejson", "dumps", TypeError, "loads",ValueError), - ("cjson", "encode", "EncodeError", "decode", "DecodeError") +_modules = [("yajl", "dumps", TypeError, "loads", ValueError, "load"), + ("jsonlib2", "write", "WriteError", "read", "ReadError", None), + ("jsonlib", "write", "WriteError", "read", "ReadError", None), + ("simplejson", "dumps", TypeError, "loads", ValueError, "load"), + ("json", "dumps", TypeError, "loads", ValueError, "load"), + ("django.utils.simplejson", "dumps", TypeError, "loads", ValueError, "load"), + ("cjson", "encode", "EncodeError", "decode", "DecodeError", None) ] -_fields = ("modname", "encoder", "encerror", "decoder", "decerror") +_fields = ("modname", "encoder", "encerror", + "decoder", "decerror", "filedecoder") class _JsonImplementation(object): @@ -48,6 +59,7 @@ class _JsonImplementation(object): self.implementation = modinfo["modname"] self._encode = getattr(module, modinfo["encoder"]) self._decode = getattr(module, modinfo["decoder"]) + self._filedecode = getattr(module, modinfo["filedecoder"]) self._encode_error = modinfo["encerror"] self._decode_error = modinfo["decerror"] @@ -78,8 +90,11 @@ class _JsonImplementation(object): def loads(self, s): """deserialize the string to python data types. Raises - ValueError if the string vould not be parsed.""" + ValueError if the string could not be parsed.""" + # uses StringIO to support buffer objects. try: + if self._filedecode: + return self._filedecode(StringIO(s)) return self._decode(s) except self._decode_error, exc: raise ValueError(*exc.args) |