# Trestle JSON support

If simplejson is installed, Trestle uses a special output checker for output that claims to be json data. When Trestle sees a response with the content type "application/json", the json checker is automatically activated and used in place of the normal output checker.

In the examples below, the full responses are:

    GET /list

a list

    [1, 2, 3, "a cow", "a monkey", [2, 5, 6], "the end"]

    GET /dict

a dict

    {"a": 1, "b": "hello", "another": [5, 1, 9], "sub": {"key": "value"}}

    GET /string

a string

    "The quick brown dog jumped over the lazy fox. Again."

    GET /number

a number

    1293039483

When using the json output checker, a variety of wildcard-like features are supported.

# <any>

The special construct <any> may be used as a list term or dict key or value. In a list, it matches one or more terms.

    GET /list

a list

    [1, 2, 3, "a cow", "a monkey", [2, 5, 6], "the end"]

    [<any>]

    [1, 2, 3, <any>]

    [<any>, "the end"]

    [<any>, "a cow", <any>]

In a dict, when used as a key and value, it matches one or more keys.

    GET /dict

a dict

    {"a": 1, "b": "hello", "another": [5, 1, 9], "sub": {"key": "value"}}

    {"a": 1, <any>: <any>}

# <timestamp>

A timestamp wildcard matches strings of 6 or more contiguous digits.

    GET /number

a timestamp-like number

    <timestamp>

## Source

This document was built from the following .rst document:

    Trestle JSON support
    --------------------

    .. fixtures:: about_json

    If simplejson_ is installed, Trestle uses a special output checker for output
    that claims to be json data. When Trestle sees a response with the content
    type "application/json", the json checker is automatically activated and used
    in place of the normal output checker.

    In the examples below, the full responses are:

    .. request:: a list

       GET /list
    ..

    .. response::

       [1, 2, 3, "a cow", "a monkey", [2, 5, 6], "the end"]
    ..

    .. request:: a dict

       GET /dict
    ..

    .. response::

       {"a": 1, "b": "hello", "another": [5, 1, 9], "sub": {"key": "value"}}
    ..

    .. request:: a string

       GET /string
    ..

    .. response::

       "The quick brown dog jumped over the lazy fox. Again."
    ..

    .. request:: a number

       GET /number
    ..

    .. response::

       1293039483
    ..

    When using the json output checker, a variety of wildcard-like
    features are supported.

    <any>
    ~~~~~

    The special construct <any> may be used as a list term or dict key or
    value. In a list, it matches one or more terms.

    .. request:: a list

       GET /list
    ..

    .. response::

       [1, 2, 3, "a cow", "a monkey", [2, 5, 6], "the end"]
    ..

    .. response::

       [<any>]
    ..

    .. response::

      [1, 2, 3, <any>]
    ..

    .. response::

       [<any>, "the end"]
    ..

    .. response::

       [<any>, "a cow", <any>]
    ..

    In a dict, when used as a key **and value**, it matches one or more keys.

    .. request:: a dict

       GET /dict
    ..

    .. response::

       {"a": 1, "b": "hello", "another": [5, 1, 9], "sub": {"key": "value"}}
    ..

    .. response::

       {"a": 1, <any>: <any>}
    ..

    <timestamp>
    ~~~~~~~~~~~

    A timestamp wildcard matches strings of 6 or more contiguous digits.

    .. request:: a timestamp-like number

       GET /number
    ..

    .. response::

       <timestamp>
    ..

    Source
    ^^^^^^

    This document was built from the following .rst document:

    .. include:: json.rst
       :literal:

    Using this fixture module:

    .. include:: about_json.py
       :literal:

    .. _`simplejson` : http://pypi.python.org/pypi/simplejson

Using this fixture module:

    from paste.fixture import TestApp
    from simplejson import dumps
    from cgi import parse_qsl
    from trestle.json import odict

    LIST = [1, 2, 3, "a cow", "a monkey", [2, 5, 6], "the end"]
    DICT = odict(
        [("a", 1), ("b", "hello"), ("another", [5, 1, 9]),
         ("sub", {"key": "value"})])
    STRING = "The quick brown dog jumped over the lazy fox. Again."
    NUMBER = 1293039483

    def app(environ, start_response):
        start_response('200 Ok', [('Content-type', 'application/json')])

        thing = environ['PATH_INFO'][1:].upper()

        if environ['REQUEST_METHOD'] == 'GET':
            return [dumps(globals()[thing])]
        elif environ['REQUEST_METHOD'] == 'POST':
            post_data = str(environ['wsgi.input'].read())
            params = parse_qsl(post_data)
            return ['You said: ',
                    ' and '.join('%s=%s' % p for p in params)]

    def setup_all(cls):
        pass

    def teardown_all(cls):
        pass

    def setup_each(inst):
        pass

    def teardown_each(inst):
        pass

    client = TestApp(app)