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:
​Configuration Settings​
​Output Rendering​
API References:
​Cement Json Extension​
​Python Json Library​
This extension does not have any external dependencies.
This extension does not rely on any application level configuration settings or meta options.
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
:
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
myapp.pyfrom cement import App​class MyApp(App):class Meta:label = 'myapp'extensions = ['json']config_handler = 'json'config_file_suffix = '.json'
~/.myapp.json{"myapp": {"foo": "bar"}}
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.
myapp.pyfrom 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 = METAoutput_handler = 'mustache'template_dir = './templates'​with MyApp() as app:app.run()​data = {'foo': 'bar'}app.render(data, 'example.m')
templates/example.mFoo: {{ foo }}
$ python myapp.pyFoo: bar​$ python myapp.py -o json{"foo": "bar"}