Json

Introduction

The JSON Extension provides the JsonOutputHandler for output rendering in pure JSON, as well as the JsonConfigHandler that allows applications to use JSON configuration files as a drop-in replacement of the default ConfigParserConfigHandler.

Documentation References:

API References:

Requirements

This extension does not have any external dependencies.

Configuration

This extension does not rely on any application level configuration settings or meta options.

Using an Alternative Json Module

In some edge cases users have wanted to use an alternative json module for performance reasons, in particular UltraJson. It is possible to override the backend json library module to use, such as ujson or another drop-in replacement library. The recommended solution would be to override the JsonOutputHandler.Meta.json_module:

Example: Using an Alternative Json Module
from cement import App, init_defaults
META = init_defaults('output.json', 'config.json')
META['output.json']['json_module'] = 'ujson'
META['config.json']['json_module'] = 'ujson'
class MyApp(App):
class Meta:
label = 'myapp'
extensions = ['json']
meta_defaults = META

Usage

Config Handler

Example: Using Json Config Handler
myapp.py
~/.myapp.json
from cement import App
class MyApp(App):
class Meta:
label = 'myapp'
extensions = ['json']
config_handler = 'json'
config_file_suffix = '.json'

Output Handler

In general, you likely would not set output_handler to json, but rather another type of output handler that displays readable output to the end-user (ex: Mustache, Jinja2, or Tabulate). However, Cement supports overriding handlers via command line options if the Handler.Meta.overridable option is set. For example, -o json will trigger the framework to use the json output handler, overriding the default set in App.Meta.output_handler.

See the documentation on Overriding Handlers via Command Line.

Example: Using Json Output Handler
cli
myapp.py
templates/example.m
from cement import App, init_defaults
META = init_defaults('output.json')
META['output.json']['overridable'] = True
class MyApp(App):
class Meta:
label = 'myapp'
extensions = ['json', 'mustache']
meta_defaults = META
output_handler = 'mustache'
template_dir = './templates'
with MyApp() as app:
app.run()
data = {'foo': 'bar'}
app.render(data, 'example.m')
$ python myapp.py
Foo: bar
$ python myapp.py -o json
{"foo": "bar"}