jayvdb / jsonlib2

Automatically exported from code.google.com/p/jsonlib2
MIT License
0 stars 0 forks source link

:Author: John Millikin :Copyright: This document has been placed in the public domain.

Overview

This is yet another library for reading/writing json. The goal is to be API compatible with simplejson <http://pypi.python.org/pypi/simplejson>_, except that it is written purely in C and is thus 5x-20x faster for both encoding and decoding, depending on the data.

This is a fork of the jsonlib <https://launchpad.net/jsonlib> project by the folks over at Freebase <https://www.freebase.com> who have data coming from a variety of internal sources in different encodings and formats, not all of which could simply be represented by strict JSON.

Thus, the intent of this fork is to be more lenient in its encoding and decoding (as simplejson is) allowing things like NaN/-NaN/Infinity, automatic handling of unicode, and more. The first release of jsonlib2 was version 1.4, which was forked from jsonlib 1.3.10.

.. contents::

Usage

jsonlib2 has two functions of interest, read and write. It also defines some exception: ReadError, WriteError, and UnknownSerializerError.

For compatibility with the standard library, read is aliased to loads and write is aliased to dumps. They do not have the same set of advanced parameters, but may be used interchangeably for simple invocations.

Deserialization

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

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

Floating-point values


By default, ``jsonlib2`` will parse values such as "1.1" into an instance of
``decimal.Decimal``. To use the built-in value type ``float`` instead, set
the ``use_float`` parameter to ``True``. Please note that this may cause a
loss of precision when parsing some values. ::

    >>> jsonlib2.read ('[1.5]', use_float = True)
    [1.5]
    >>> jsonlib2.read ('[1.1]', use_float = True)
    [1.1000000000000001]
    >>> jsonlib2.read ('[3.14159265358979323846]', use_float = True)
    [3.1415926535897931]

Serialization
-------------

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

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

Pretty-Printing

To "pretty-print" the output, pass a value for the indent parameter. ::

>>> print jsonlib2.write (['Hello world!'], indent = '    ')
[
    "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. ::

    >>> jsonlib2.write ({'e': 'Hello', 'm': 'World!'})
    '{"m":"World!","e":"Hello"}'
    >>> jsonlib2.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. ::

>>> jsonlib2.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. ::

>>> jsonlib2.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 ensure_ascii to False. ::

>>> jsonlib2.write ([u'Hello \u266a'], encoding = None)
u'["Hello \\u266a"]'
>>> jsonlib2.write ([u'Hello \u266a'], encoding = None, ensure_ascii = False)
u'["Hello \u266a"]'

Mapping Key Coercion


Because JSON objects must have string keys, strings will be 'coerced'
to strings. You can override this with the ``coerce_keys`` parameter,
whcih will raise exception when non-string keys are encountered in a
mapping. ::

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

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 jsonlib2, use the default parameter to write::

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

Streaming Serializer


When serializing large objects, the use of an in-memory buffer may cause
too much memory to be used. For these situations, use the ``dump`` function
to write objects to a file-like object::

    >>> import sys
    >>> jsonlib2.dump (["Written to stdout"], sys.stdout)
    ["Written to stdout"]
    >>> 

Exceptions
-----------

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`` or ``dump`` if an error was encountered serializing
the passed value.

UnknownSerializerError

A subclass of WriteError that is raised when a value cannot be serialized. See the default parameter to write.

Change Log

1.5.1

1.5

1.4.2

1.4.1

1.4

1.3.10

1.3.9

1.3.8

1.3.7

1.3.6

1.3.5

1.3.4

1.3.3

1.3.2

1.3.1

1.3.0

1.2.7

1.2.6

Thanks to Deron Meranda (author of demjson) for his excellent JSON library comparison <http://deron.meranda.us/python/comparing_json_modules/>_, which revealed many areas for improvement:

Also includes some other miscellaneous fixes:

1.2.5

1.2.4

1.2.3

1.2.2

1.2.1

1.2.0

1.1.0

1.0.0