handle duplicate JSON keys only when possible

This commit is contained in:
Stefan Kögl 2013-10-09 18:55:22 +02:00
parent bd90a7a39d
commit 4d0389238e
2 changed files with 24 additions and 3 deletions

View File

@ -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))

View File

@ -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