24
>>> raw_post_data = request.raw_post_data
>>> print raw_post_data
{"group":{"groupId":"2", "groupName":"GroupName"}, "members":{"1":{"firstName":"fName","lastName":"LName","address":"address"},"1": {"firstName":"f_Name","lastName":"L_Name","address":"_address"}}}
>>> create_request = json.loads(raw_post_data)
>>> print create_request
{u'group': {u'groupName': u'GroupName', u'groupId': u'2'}, u'members': {u'1': {u'lastName': u'L_Name', u'firstName': u'f_Name', u'address': u'_address'}}}

ご覧のとおり、使用するとキー「1」のメンバーが上書きされますjson.dumps()

クライアントからのリクエストで重複したキーが見つかったと言って、Pythonで例外としてキャッチする方法はありますか?

4

4 に答える 4

37

application/jsonメディア タイプの RFC 4627 は一意のキーを推奨していますが、明示的に禁止していません。

オブジェクト内の名前は一意である必要があります。

RFC 2119から:

SHOULD この単語、または形容詞の「RECOMMENDED」は、
特定の状況では特定の項目を無視する正当な理由が存在する可能性があることを意味しますが、別のコースを選択する前に
、完全な意味を理解し、
慎重に検討する必要があります。

import json

def dict_raise_on_duplicates(ordered_pairs):
    """Reject duplicate keys."""
    d = {}
    for k, v in ordered_pairs:
        if k in d:
           raise ValueError("duplicate key: %r" % (k,))
        else:
           d[k] = v
    return d

json.loads(raw_post_data, object_pairs_hook=dict_raise_on_duplicates)
# -> ValueError: duplicate key: u'1'
于 2013-02-15T20:10:18.597 に答える
1

または、(レベルごとに)重複するすべてのキーをキャッチする場合は、collections.Counter

from collections import Counter

class KeyWatcher(dict):

    def __init__(self, *args):
        duplicates = [d for d,i in Counter([pair[0] for pair in args[0]]).items() if i > 0]
        if duplicates:
            raise KeyError("Can't add duplicate keys {} to a json message".format(duplicates))
        self.update(*args[0])

json.loads(raw_post_data, object_pairs_hook=KeyWatcher)
于 2013-02-15T21:26:55.003 に答える