jsonmerge是一个将两个json对象进行合并的python库,在合并的过程中,可以指定合并策略。
官方地址:https://pypi.org/project/jsonmerge/
github地址:https://github.com/avian2/jsonmerge
1、安装:
jsonmerge支持python2.7、python3.5
pip install jsonmerge
注:jsonmerge依赖jsonschema库(https://pypi.python.org/pypi/jsonschema), 该库实现了JSON Schema for python。
2、使用:
1)基本使用:
>>> base = {
... "foo": 1,
... "bar": [ "one" ],
... }
>>> head = {
... "bar": [ "two" ],
... "baz": "Hello, world!"
... }
>>> from pprint import pprint
>>> from jsonmerge import merge
>>> result = merge(base, head)
>>> pprint(result, width=40)
{'bar': ['two'],
'baz': 'Hello, world!',
'foo': 1}
jsonmerge会返回base、head中所有的(并集)字段,对于重复的字段,默认将head中的值覆盖base中的字段值。
在实际中,可以通过JSON Schema的方式来设置合并策略。(jsonmerge默认使用JSON Schema的Draft 4)
2)指定合并侧滤:
>>> schema = {
... "properties": {
... "bar": {
... "mergeStrategy": "append"
... }
... }
... }
>>> from jsonmerge import Merger
>>> merger = Merger(schema)
>>> result = merger.merge(base, head)
>>> pprint(result, width=40)
{'bar': ['one', 'two'],
'baz': 'Hello, world!',
'foo': 1}
更多使用方式见github上的测试用例:https://github.com/avian2/jsonmerge/blob/master/tests/test_jsonmerge.py
3、常见策略:
- overwrite:适用于任何类型,用base中的值覆盖head中的值;
- append:适用于数组类型,将head中数组类型的值append到对应base中;
- discard:适用于任何类型,即使head包含不同的值,也应将值保留在base中的。默认情况下,如果base不包含任何值(即文档的该部分未定义),则合并后的值将保持未定义状态。可以使用keepIfUndef选项进行更改。如果此选项为true,则在这种情况下将保留head的值。如果您要合并一系列文档并希望保留该系列中首次出现的值,但又想放弃进一步的修改,这将很有用。