Skip to main content

JSON serializer/deserializer for Python

Project description

Author:

John Millikin

Overview

JSON is a lightweight data-interchange format. It is often used for exchanging data between a web server and user agent.

This module aims to produce a library for serializing and deserializing JSON that conforms strictly to RFC 4627.

Usage

jsonlib has two functions of interest, read and write. It also has an errors module containing the exception classes that will be raised

Deserialization

To deserialize a JSON expression, call the jsonlib.read function with an instance of str or unicode.

>>> jsonlib.read ('["Hello world!"]')
[u'Hello world!']

Serialization

Serialization has more options, but they are set to reasonable defaults. The simplest use is to call jsonlib.write with a Python value.

>>> jsonlib.write (['Hello world!'])
'["Hello world!"]'

Pretty-Printing

To “pretty-print” the output, pass a value for the indent parameter.

>>> print jsonlib.write (['Hello world!'], indent = '\t')
[
        "Hello world!"
]
>>>

Mapping Key Sorting

By default, mapping keys are serialized in whatever order they are stored by Python. To force a consistent ordering (for example, in doctests) use the sort_keys parameter.

>>> jsonlib.write ({'e': 'Hello', 'm': 'World!'})
'{"m":"World!","e":"Hello"}'
>>> jsonlib.write ({'e': 'Hello', 'm': 'World!'}, sort_keys = True)
'{"e":"Hello","m":"World!"}'

Encoding and Unicode

By default, the output is encoded in UTF-8. If you require a different encoding, pass the name of a Python codec as the encoding parameter.

>>> jsonlib.write (['Hello world!'], encoding = 'utf-16-be')
'\x00[\x00"\x00H\x00e\x00l\x00l\x00o\x00 \x00w\x00o\x00r\x00l\x00d\x00!\x00"\x00]'

To retrieve an unencoded unicode instance, pass None for the encoding.

>>> jsonlib.write (['Hello world!'], encoding = None)
u'["Hello world!"]'

By default, non-ASCII codepoints are forbidden in the output. To include higher codepoints in the output, set ascii_only to False.

>>> jsonlib.write ([u'Hello \u266A'], encoding = None)
u'["Hello \\u266A"]'
>>> jsonlib.write ([u'Hello \u266A'], encoding = None, ascii_only = False)
u'["Hello \u266A"]'

Mapping Key Coercion

Because JSON objects must have string keys, an exception will be raised when non-string keys are encountered in a mapping. It can be useful to coerce mapping keys to strings, so the coerce_keys parameter is available.

>>> jsonlib.write ({True: 1})
Traceback (most recent call last):
jsonlib.errors.WriteError: Only strings may be used as object keys.
>>> jsonlib.write ({True: 1}, coerce_keys = True)
'{"true":1}'

Serializing Other Types

If the object implements the iterator or mapping protocol, it will be handled automatically. If the object is intended for use as a basic value, it should subclass one of the supported basic values.

String-like objects that do not inherit from str, unicode, or UserString.UserString will likely be serialized as a list. This will not be changed. If iterating them returns an instance of the same type, the serializer might crash. This (hopefully) will be changed.

To serialize a type not known to jsonlib, use the on_unknown parameter to write:

>>> from datetime import date
>>> def unknown_handler (value):
...     if isinstance (value, date): return str (value)
...     raise jsonlib.UnknownSerializerError
>>> jsonlib.write ([date (2000, 1, 1)], on_unknown = unknown_handler)
'["2000-01-01"]'

Exceptions

The jsonlib.errors module contains definitions for the error classes raised from read and write.

ReadError

Raised by read if an error was encountered parsing the expression. Will contain the line, column, and character position of the error.

Note that this will report the character, not the byte, of the character that caused the error.

WriteError

Raised by write if an error was encountered serializing the passed value.

UnknownSerializerError

A subclass of WriteError that is raised when a value cannot be serialized.

Other JSON Libraries

demjson is a powerful and compliant library, which supports encoding autodetection, UTF-32, and surrogate pair handling. This is a very good library to use when extension modules cannot be installed. I advise always using “strict mode”.

simplejson is likely the most popular JSON library for Python, used by many web frameworks such as Django. Recent versions have improved in their support for Unicode, although it (as of 2008-03-28) still does not support encoding autodetection. I like demjson better.

python-cjson is designed for speed, but uses bytestrings internally and has poor support for Unicode. I advise against its use, unless you will only use ASCII text and need the performance.

python-json is one of the first JSON libraries for Python. It is no longer maintained and has numerous issues, especially regarding Unicode. I advise against using this library for any reason.

Change Log

1.3.3

  • Support the on_unknown parameter to write.

  • Corrected typo in invalid whitespace detection.

  • Added __version__ attribute.

  • Merged all code into jsonlib and _jsonlib modules, instead of a package.

1.3.2

  • Improved the README.

  • Support for reading text encoded with the utf-8-sig codec.

  • Use codecs module for detecting BOMs in input data.

  • Forbid non-whitespace strings from being used for indentation.

1.3.1

  • Removed the Python implementations of the serializer and deserializer.

  • Detect and raise an exception if invalid surrogate pairs are serialized or deserialized.

  • Detect and raise an exception if reserved codepoints are serialized or deserialized.

  • Added support for operating in a process with multiple Python interpreters.

  • Performance improvements.

1.3.0

  • Allow python setup.py test to work.

  • Added encoding parameter to write, which controls the output encoding. The default encoding is utf-8. If the encoding is None, a unicode string will be returned.

  • Implemented write using a C extension module.

1.2.7

  • Improved error messages when an error is encountered deserializing an expression.

  • Modified to work with Python 2.4.

1.2.6

Thanks to Deron Meranda (author of demjson) for his excellent JSON library comparison, which revealed many areas for improvement:

  • Use repr instead of unicode for serializing floating-point values, to avoid unnecessary rounding.

  • Fixed bug that prevented plus signs in an exponent from being parsed correctly.

  • Added support for serializing the following types:

    • generator

    • set

    • frozenset

    • complex, for values with no imaginary component.

    • array.array

    • collections.deque

    • collections.defaultdict

    • UserList.UserList

    • UserDict.UserDict

    • UserString.UserString

  • Raise an exception if a control character is encountered in a string.

  • Added support for detecting Unicode byte order marks in the auto decoder.

  • Allow only arrays and objects to be serialized directly. All other types must be contained within an array or object.

  • Stricter detection of whitespace.

Also includes some other miscellaneous fixes:

  • More reliable detection of Infinity and NaN on Windows.

  • Support for decoding UTF-32 on UCS2 builds of Python.

  • Faster detection of self-recursive containers.

1.2.5

  • Return Unicode strings from write, so the user can control the final encoding.

  • Prevent Infinity, -Infinity, and NaN from being serialized because JSON does not support these values.

  • Added coerce_keys parameter to write. If True, mapping keys will be coerced to strings. Defaults to False.

  • Added ascii_only parameter to write. If True, non-ASCII codepoints will always be escaped to a u sequence. Defaults to True.

  • Real detection of self-recursive container types.

  • Escape the solidus to prevent against security issues.

1.2.4

  • Fixed bug that prevented characters from being read after reading a Unicode escape sequence.

  • Moved test cases into jsonlib.tests subpackage.

1.2.3

  • Port to setuptools.

  • Corrected false positive in detection of illegal leading zeroes.

1.2.2

  • Raise an exception if values in an object or array are not separated by commas.

1.2.1

  • Support for building on Windows.

1.2.0

  • Added sort_keys parameter to write. This allows mapping types to be serialized to a predictable value, regardless of key ordering.

  • Added indent to write. Any string passed as this value will be used for indentation. If the value is not None, pretty-printing will be activated.

1.1.0

  • Support for reading astral Unicode codepoints on UCS2 builds of Python.

1.0.0

  • Initial release.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jsonlib-1.3.3.tar.gz (21.3 kB view details)

Uploaded Source

Built Distributions

jsonlib-1.3.3.win32-py2.5.exe (88.8 kB view details)

Uploaded Source

jsonlib-1.3.3.win32-py2.4.exe (83.7 kB view details)

Uploaded Source

jsonlib-1.3.3-py2.5-win32.egg (19.1 kB view details)

Uploaded Egg

jsonlib-1.3.3-py2.5-macosx-10.3-i386.egg (31.2 kB view details)

Uploaded Egg

jsonlib-1.3.3-py2.5-linux-i686.egg (39.1 kB view details)

Uploaded Egg

jsonlib-1.3.3-py2.4-win32.egg (19.4 kB view details)

Uploaded Egg

jsonlib-1.3.3-py2.4-macosx-10.3-fat.egg (31.3 kB view details)

Uploaded Egg

jsonlib-1.3.3-py2.4-linux-i686.egg (39.3 kB view details)

Uploaded Egg

File details

Details for the file jsonlib-1.3.3.tar.gz.

File metadata

  • Download URL: jsonlib-1.3.3.tar.gz
  • Upload date:
  • Size: 21.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for jsonlib-1.3.3.tar.gz
Algorithm Hash digest
SHA256 06b01f6b98fb99c1c07860e03f291054014f36f45f85a9cda25c9d5ba30caf0d
MD5 132a92c544108668984883f1ae850285
BLAKE2b-256 ee21280f1eba055fc31f5727d59e3bac90dc722f810d598f13e1b91f5f9d2b1f

See more details on using hashes here.

File details

Details for the file jsonlib-1.3.3.win32-py2.5.exe.

File metadata

File hashes

Hashes for jsonlib-1.3.3.win32-py2.5.exe
Algorithm Hash digest
SHA256 f43e097568426edc1a6440c042a2c3d085eb4cb896c4667104d487bfeccb86c4
MD5 fe5aaa8c810121655267842eb079d077
BLAKE2b-256 c4fdd3054023ccb2646f953d9b240b0cdcd1ed70c626824b6fa5b2cb2e474f01

See more details on using hashes here.

File details

Details for the file jsonlib-1.3.3.win32-py2.4.exe.

File metadata

File hashes

Hashes for jsonlib-1.3.3.win32-py2.4.exe
Algorithm Hash digest
SHA256 a7035018b9b3a37d73f6b309a5938d1737c7b3358a7fb860a76af0e083af3bf4
MD5 6ac40c05ff15f72db06d3a772a879191
BLAKE2b-256 ca13e22b736a19f06272eef4d8e0884e075ab6342793e6ae0d2c570ccf34250c

See more details on using hashes here.

File details

Details for the file jsonlib-1.3.3-py2.5-win32.egg.

File metadata

File hashes

Hashes for jsonlib-1.3.3-py2.5-win32.egg
Algorithm Hash digest
SHA256 0e2af7cda608abb0d275e8b1f28a9b8d639069c93de056cf7f84dd60941e5377
MD5 fb50f89f2574bc481c3c62f5b2108ad2
BLAKE2b-256 b8c0ef666da5a03e5686f6cff2ae33bd65b49be2ee48d14b41af507e9b7ab329

See more details on using hashes here.

File details

Details for the file jsonlib-1.3.3-py2.5-macosx-10.3-i386.egg.

File metadata

File hashes

Hashes for jsonlib-1.3.3-py2.5-macosx-10.3-i386.egg
Algorithm Hash digest
SHA256 2c5aa44b5d5e0070d8dfa0257a5be408c2933fff576d96f01e50e72a4181f036
MD5 1732569ef3ff5007044d8d7de49b0a64
BLAKE2b-256 a68ee7d746f188946810eb28d93e9d296ab6ecb0686e2de6326a0985cd0816d6

See more details on using hashes here.

File details

Details for the file jsonlib-1.3.3-py2.5-linux-i686.egg.

File metadata

File hashes

Hashes for jsonlib-1.3.3-py2.5-linux-i686.egg
Algorithm Hash digest
SHA256 64457fbe61567aec61cf397837968270b34a499b779a43bc3718809e59c3c5bc
MD5 5213da71c1f69c3a7fd67d3cb35147ab
BLAKE2b-256 072dd17011e76fc026b38e273e529f022ec867b1eb9a3401a3765597bc2d5676

See more details on using hashes here.

File details

Details for the file jsonlib-1.3.3-py2.4-win32.egg.

File metadata

File hashes

Hashes for jsonlib-1.3.3-py2.4-win32.egg
Algorithm Hash digest
SHA256 8e174d23676cd4dd23724fec75062178ddf130f8ced9f354df576b6ce997535a
MD5 148fe33447c2cf24585b1833a2494ca4
BLAKE2b-256 6f7d69f98a64c427258b35e425f0236aeceee072b9f458390486feb58bd9f93c

See more details on using hashes here.

File details

Details for the file jsonlib-1.3.3-py2.4-macosx-10.3-fat.egg.

File metadata

File hashes

Hashes for jsonlib-1.3.3-py2.4-macosx-10.3-fat.egg
Algorithm Hash digest
SHA256 f02d1bf3d1570153b20975f1818211a3c7e36dd660d0771a929fabfbc8bfbd0e
MD5 e3f52bebdd5f92c996cb07e91cd43768
BLAKE2b-256 6f7aeeeda4a8edccbe49ae8137cdce4e4cac20c97008172151f43e0a739759a8

See more details on using hashes here.

File details

Details for the file jsonlib-1.3.3-py2.4-linux-i686.egg.

File metadata

File hashes

Hashes for jsonlib-1.3.3-py2.4-linux-i686.egg
Algorithm Hash digest
SHA256 8fbab70f20dd949e0491cfa9aea2fa2cdb7fe325a00bcb70d894b0288711d31a
MD5 7c1911455332e25c40f883b471639bf8
BLAKE2b-256 4890dfe69f385544faad54e713d7359c77a6c7e10febfec30505730850e6ce19

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page