Skip to main content
Version: v4.5.0

edit-json


The Declarative Hook edit-json defines changes made to existing JSON files. See an example of defining a Declarative Hook of type edit-json below :

name: "hook-edit-json"
description: Test edit-json in hooks
types:
- app
inputs:
- label: Just a text
type: text
name: json_body
- label: Just a Tag
type: text
name: json_tag
hooks:
- type: edit-json
trigger: after-render
path: package.json
indent: "\t"
encoding: utf-8
changes:
- jsonpath: "$.scripts"
update:
value: |
{
"test": "hello 123",
"hello": "how are you doing"
}
- jsonpath: "$"
remove:
- name: private
- name: devDependencies
- jsonpath: "$.log"
clear: true

Available Actions

path:

Defines the path to the file it will be edited. The path can have Jinja expressions.

path: package.json

trigger:

Field to set triggers that tell you when file editing should occur.

before-input: Executes the Declarative Hook before receiving the input parameters from the user.

trigger: before-input

before-render:
Runs the Declarative Hook before the Template generates files in the project.

trigger: before-render

after-render:
Runs the Declarative Hook after the Template generates files in the project.

trigger: after-render

enconding:

This sets the encoding type to be written to the file and accepts the formats [ascii, utf-8, utf-16]. The default value is utf-8.

encoding: utf-8

indent:

Defines the character(s) or the number of spaces for the indentation of the generated document. The default value for spaces is 2.

indent: "\t"

changes:

It is a list of editing actions it will be executed in the order they appear. And your block has the required parameter jsonpath.

info

During the lookup process in the changes attribute, all nodes that match the criteria (jsonpath attribute) are changed at once. You can make several changes in a file just by using expressions.

Check out some accepted expressions:

Click here to expand!
ExpressionDescription
@Define the object's current element.
$Define the object's root element.
()This is a script expression, using the underlying script engine.
[start:end]Returns a copy of part of an array from a subarray created between the start and end positions (the end is not included) of an original array.
?()Apply the filter to the expression of the script.
[]This is a child operator which was used in expressions.
..This is a recursive descent.
*It is used in object elements regardless of using their names.
[]In JSON and javascript, it is the operator of the native array.
[,]JSON path is allowing us a set of array indices and names.

jsonpath:

Allows you to enter the JSON search language. It is Mandatory.

changes:
- jsonpath: "$.packages.version"
...

If necessary, see jsonpath Support

It is possible to interpolate the values of the xpath field with Jinja:

hooks:
- type: edit-json
trigger: after-render
path: package.json
indent: "\t"
encoding: utf-8
changes:
- jsonpath: "$.scripts[?name = '{{INTERPOLATE-INPUT-HERE}}']"
update:
value: |
{
"test": "hello 123",
"hello": "how are you doing"
}

update:
Changes or adds an item within a result from a jsonpath. Available fields are value or snippet.

value
Receives the value to be added to JSON.

  update:
value: "qa"

snippet
Receives the snippet to add to a JSON.

update:
snippet: snippets/fragment.json

remove:
Removes a dictionary element. The available field is name.

name:
Receives the name of the element to be removed from the JSON dictionary. It is possible to interpolate the values of the name field with Jinja:

- jsonpath: "$.scripts"
remove:
- name: prepare

clear:
Removes all content from the JSON node, in the jsonpath context. Accepted values are true or false.

  - jsonpath: "$.devDependencies"
clear: true

when:

Conditional action that evaluates whether the insertion will take effect. The available option is not-exists, which receives the text or file to be evaluated by the condition.

not-exists: Checks if the values entered in the value field exists in the file. If there is, the actions update, remove and clear will not be effective.

hooks:
- jsonpath: "$.some"
update:
value: |
{
"not-existing": {
"item": 2
}
}
when:
not-exists: "$.some.not-existing"

Read Also

Was this page helpful?