summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorChristian Lyder Jacobsen <christian@yocuda.com>2020-03-06 11:41:38 +0100
committerChristian Lyder Jacobsen <christian@yocuda.com>2020-03-06 12:07:24 +0100
commit0167d345ee9d7ef0f74b947ec3a7ea94def178be (patch)
tree34b4358b9b96ac73ca06c5d741bd7c344cb164a8 /doc
parente99d178396f69f8891a62e21434c2783b76146b2 (diff)
downloadpython-json-patch-0167d345ee9d7ef0f74b947ec3a7ea94def178be.tar.gz
Subclassing can override json dumper and loader
Additionally: * from_string gets a loads parameter * to_string gets a dumps_parameter * documentation added * added more tests
Diffstat (limited to 'doc')
-rw-r--r--doc/tutorial.rst52
1 files changed, 52 insertions, 0 deletions
diff --git a/doc/tutorial.rst b/doc/tutorial.rst
index 538cd0e..0bb1a9c 100644
--- a/doc/tutorial.rst
+++ b/doc/tutorial.rst
@@ -67,3 +67,55 @@ explicitly.
# or from a list
>>> patch = [{'op': 'add', 'path': '/baz', 'value': 'qux'}]
>>> res = jsonpatch.apply_patch(obj, patch)
+
+
+Dealing with Custom Types
+-------------------------
+
+Custom JSON dump and load functions can be used to support custom types such as
+`decimal.Decimal`. The following examples shows how the
+`simplejson <https://simplejson.readthedocs.io/>`_ package, which has native
+support for Python's ``Decimal`` type, can be used to create a custom
+``JsonPatch`` subclass with ``Decimal`` support:
+
+.. code-block:: python
+
+ >>> import decimal
+ >>> import simplejson
+
+ >>> class DecimalJsonPatch(jsonpatch.JsonPatch):
+ @staticmethod
+ def json_dumper(obj):
+ return simplejson.dumps(obj)
+
+ @staticmethod
+ def json_loader(obj):
+ return simplejson.loads(obj, use_decimal=True,
+ object_pairs_hook=jsonpatch.multidict)
+
+ >>> src = {}
+ >>> dst = {'bar': decimal.Decimal('1.10')}
+ >>> patch = DecimalJsonPatch.from_diff(src, dst)
+ >>> doc = {'foo': 1}
+ >>> result = patch.apply(doc)
+ {'foo': 1, 'bar': Decimal('1.10')}
+
+Instead of subclassing it is also possible to pass a dump function to
+``from_diff``:
+
+ >>> patch = jsonpatch.JsonPatch.from_diff(src, dst, dumps=simplejson.dumps)
+
+a dumps function to ``to_string``:
+
+ >>> serialized_patch = patch.to_string(dumps=simplejson.dumps)
+ '[{"op": "add", "path": "/bar", "value": 1.10}]'
+
+and load function to ``from_string``:
+
+ >>> import functools
+ >>> loads = functools.partial(simplejson.loads, use_decimal=True,
+ object_pairs_hook=jsonpatch.multidict)
+ >>> patch.from_string(serialized_patch, loads=loads)
+ >>> doc = {'foo': 1}
+ >>> result = patch.apply(doc)
+ {'foo': 1, 'bar': Decimal('1.10')}