json_modify is simple library that helps apply modifications
to json/yaml files and python representations of json.
pip install json_modify
from json_modify import apply_actions
source = {
"spec": {
"name": "test",
"metadata": [
{"name": "test1", "value": "test1"},
{"name": "test2", "value": "test2"}
],
"values": {"value1": 10, "value2": 20}
}
}
actions = [
{"action": "add",
"path": "spec/values",
"value": {"value3": 30, "value4": 40}}
]
result = apply_actions(source, actions)
print(result)
{"spec": {
"name": "test",
"metadata": [
{"name": "test1", "value": "test1"},
{"name": "test2", "value": "test2"}
],
"values": {
"value1": 10, "value2": 20,
"value3": 30, "value4": 40}
}
}json_modify uses markers to traverse lists. Markers should be used in path
for example:
"path": "metadata/$project_name/name"There are two types of markers:
- Filter marker (
$<marker_name>) - the kind of marker, that is used to select dictionary in list by list ofsection[key] == value. Filter marker should be described in action where it's used. For example:
{
"action": "delete",
"path": "metadata/$project_name/name",
"project_name": [{"key": "name", "value": "nginx"}]
}- Index marker (
$<index>) - the kind of marker, that is used to select specific element in list, by it's index. For example:
{
"action": "replace",
"path": ["users", "$0"],
"value": { "name": "test_user", "id": 0}
}It's allowed to use any quantity of markers and mix both types of markers in single path.
action(Required): Type of action, possible values are: add, replace, delete, rename(only for dictionaries).path(Required): Path to the field that we want to change.pathcan be string, separated by delimiter (default is\) or list of strings.value(Optional for delete, Required for other): Value that should be applied to specified path. The type of value is described for each action separately.marker(Required for each non index marker in path): List of dictionaries, that should be applied to find value in list. Each dictionary consist of:key(Required): Name of the key that should be used for search.value(Required): Value that is used to find concrete dictionary in list of dictionaries.
add: Insert values into section, specified by last key ofpath. The last key in section should lead to list or dict section.- For add action on list
valueshould be of type list, so that it'll be possible to extend current list. - For add action on dict
valueshould be of type dict, so that we can update current dict.
- For add action on list
replace: Replace section, specified by last key ofpathwithvalue.delete: Delete section, specified by last key ofpath.rename: Move content of section, specified by last key ofpathto section with name specified invalue.
- Add documentation to ReadTheDocs
- Add creation of action's by diff.
Copyright Oleksii Petrenko, 2020.
Distributed under the terms of the MIT license, json_modify is free and open source software.