diff options
author | Stefan Kögl <stefan@skoegl.net> | 2013-10-09 18:55:22 +0200 |
---|---|---|
committer | Stefan Kögl <stefan@skoegl.net> | 2013-10-09 18:55:22 +0200 |
commit | 4d0389238e1d963f859af42a9a0fa38483a7fa41 (patch) | |
tree | 5bf298b1e6fda6bb159767729e1a94584feb552e | |
parent | bd90a7a39d1307f78ad89103e960d249aafacacb (diff) | |
download | python-json-patch-4d0389238e1d963f859af42a9a0fa38483a7fa41.tar.gz |
handle duplicate JSON keys only when possible
-rwxr-xr-x | ext_tests.py | 4 | ||||
-rw-r--r-- | jsonpatch.py | 23 |
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 |