当前位置: 首页 > 面试题库 >

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

戚建德
2023-03-14
问题内容
>>> 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中的异常捕获,说在客户端的请求中找到重复的键?


问题答案:

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'


 类似资料:
  • 问题内容: 该程序将两个元素都添加到集合中。起初我很震惊,因为在添加设置方法时,调用了equals方法。 但是后来我覆盖了hashCode方法: 然后没有添加。这是令人惊讶的,因为Set和add()方法的Javadoc说它在添加到Set中时仅检查equals()。 这是add()的javadoc: 然后我意识到HashSet被实现为HashMap,并且在地图中,对象的hashCode用作键。因此,

  • 我有一本这样的字典: 我需要打印第一行上打印的值列表中的所有第一项,第二行上打印的所有第二项,第三行上打印的所有第三项。像这样: 所有项目的字符长度相同,所有列表的项目数相同。 我有一个字母列表,可以按正确的顺序获取键,我只是不知道如何打印值。我可以打印所有第一个项目: 如何创建上面的输出?

  • 问题内容: 如何只允许在此文本框中写入数字? 问题答案: 您可以订阅onkeypress事件: 然后定义函数:

  • 问题内容: 这是有效的json吗? http://jsonlint.com/表示同意。 http://www.json.org/没有说什么被禁止。 但这显然没有多大意义,对吗?大多数实现可能使用哈希表,因此无论如何都将其覆盖。 问题答案: JSON校验可以在https://www.jsonformatting.com/

  • 但显然没多大意义,不是吗?大多数实现可能使用hashtable,所以无论如何都要重写它。