json.loads允许字典中的重复键,覆盖第一个值

Anu*_*rya 19 python json

>>> 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'}}}
Run Code Online (Sandbox Code Playgroud)

正如您所见,当我使用时,会覆盖键为'1'的成员 json.dumps()

有没有办法在python中将它作为异常捕获,说在客户端的请求中发现重复键?

jfs*_*jfs 32

application/json媒体类型的rfc 4627建议使用唯一键,但它不会明确禁止它们:

对象中的名称应该是唯一的.

来自rfc 2119:

应该 这个词,或形容词"推荐",意味着
在特定情况下可能存在忽略
特定项目的正当理由,但
在选择不同的课程之前必须理解并仔细权衡全部含义.

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'
Run Code Online (Sandbox Code Playgroud)

  • @AnujAcharya:问题在于有一个简单的dict,"multidict","multi-only-on-dups-dict","raise-on-dups-dict"(带有ValueError,或者KeyError?),还有其他人.你想在`json.loads`和`json.load`,`csv.DictReader`和`yaml.load`中完全相同的东西,依此类推.(请参阅有关`csv`的python-ideas的当前讨论.)您不希望为所有可能的加载函数编写所有可能的行为.并且`object_pairs_hook`似乎是解耦它的正确方法. (2认同)