summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Kögl <stefan@skoegl.net>2013-10-09 18:55:22 +0200
committerStefan Kögl <stefan@skoegl.net>2013-10-09 18:55:22 +0200
commit4d0389238e1d963f859af42a9a0fa38483a7fa41 (patch)
tree5bf298b1e6fda6bb159767729e1a94584feb552e
parentbd90a7a39d1307f78ad89103e960d249aafacacb (diff)
downloadpython-json-patch-4d0389238e1d963f859af42a9a0fa38483a7fa41.tar.gz
handle duplicate JSON keys only when possible
-rwxr-xr-xext_tests.py4
-rw-r--r--jsonpatch.py23
2 files changed, 24 insertions, 3 deletions
diff --git a/ext_tests.py b/ext_tests.py
index 476f66d..5e5ded8 100755
--- a/ext_tests.py
+++ b/ext_tests.py
@@ -35,7 +35,6 @@
https://github.com/json-patch/json-patch-tests """
from functools import partial
-import json
import doctest
import unittest
import jsonpatch
@@ -94,7 +93,8 @@ def get_suite(filenames):
for testfile in filenames:
with open(testfile) as f:
- tests = json.load(f, object_pairs_hook=jsonpatch.multidict)
+ # we use the (potentially) patched version of json.load here
+ tests = jsonpatch.json.load(f)
cls = make_test_case(tests)
suite.addTest(unittest.makeSuite(cls))
diff --git a/jsonpatch.py b/jsonpatch.py
index 7601248..b1c01a6 100644
--- a/jsonpatch.py
+++ b/jsonpatch.py
@@ -85,6 +85,27 @@ def multidict(ordered_pairs):
return dict(d)
+def get_loadjson():
+ """ adds the object_pairs_hook parameter to json.load when possible
+
+ The "object_pairs_hook" parameter is used to handle duplicate keys when
+ loading a JSON object. This parameter does not exist in Python 2.6. This
+ methods returns an unmodified json.load for Python 2.6 and a partial
+ function with object_pairs_hook set to multidict for Python versions that
+ support the parameter. """
+
+ import inspect
+ import functools
+
+ argspec = inspect.getargspec(json.load)
+ if 'object_pairs_hook' not in argspec.args:
+ return json.load
+
+ return functools.partial(json.load, object_pairs_hook=multidict)
+
+json.load = get_loadjson()
+
+
def apply_patch(doc, patch, in_place=False):
"""Apply list of patches to specified json document.
@@ -231,7 +252,7 @@ class JsonPatch(object):
:return: :class:`JsonPatch` instance.
"""
- patch = json.loads(patch_str, object_pairs_hook=multidict)
+ patch = json.loads(patch_str)
return cls(patch)
@classmethod