Enabling JSON Export for a Component enabling-json-export-for-a-component
Components can be adapted to generate JSON export of their content based on a modeler framework.
Overview overview
The JSON Export is based on Sling Models, and on the Sling Model Exporter framework (which itself relies on Jackson annotations).
This means that the component must have a Sling Model if it must export JSON. Therefore, follow these two steps to enable JSON export on any component.
Define a Sling Model for the Component define-a-sling-model-for-the-component
First a Sling Model must be defined for the component.
The Sling Model implementation class must be annotated with the following:
@Model(... adapters = {..., ComponentExporter.class})
@Exporter(name = ExporterConstants.SLING_MODEL_EXPORTER_NAME, extensions = ExporterConstants.SLING_MODEL_EXTENSION)
@JsonSerialize(as = MyComponent.class)
This ensures that your component could be exported on its own, using the .model
selector and the .json
extension.
In addition, this specifies that the Sling Model class can be adapted into the ComponentExporter
interface.
ExporterConstants
and ComponentExporter
classes come from the com.adobe.cq.export.json
bundle.Using Multiple Selectors multiple-selectors
Although not a standard use case, it is possible to configure multiple selectors in addition to the model
selector.
https://<server>:<port>/content/page.model.selector1.selector2.json
However in such a case the model
selector must be the first selector and the extension must be .json
.
Annotate the Sling Model Interface annotate-the-sling-model-interface
To be taken into account by the JSON Exporter framework, the Model interface should implement the ComponentExporter
interface (or ContainerExporter
, in the case of a container component).
The corresponding Sling Model interface (MyComponent
) would be then annotated using Jackson annotations to define how it should be exported (serialized).
The Model interface must be properly annotated to define which methods should be serialized. By default, all methods that respect the usual naming convention for getters are serialized and will derive their JSON property names naturally from the getter names. This can be prevented or overridden using @JsonIgnore
or @JsonProperty
to rename the JSON property.
Example example
The Core Components support JSON export and can be used as a reference.
For an example, see the Sling Model implementation of the Image Core Component and its annotated interface.