【问题标题】:Difference between a python dictionary object and what json.loads returnpython字典对象和json.loads返回的区别
【发布时间】:2019-05-04 16:28:51
【问题描述】:

我有一个关于普通 Python 字典对象和作为 json.loads(str) 的输出返回的内容之间的区别的问题。根据检查两个对象的 type() ,它说 dict.但是如果 json.load() 实际上返回一个普通的字典或字典格式的 json 对象,我想确认这一点。 我的代码如下:

import json
my_dict={'key1': 'val1', 'key2': 'val2'}
my_json_string = json.dumps(my_dict)
resp_json=json.loads(my_json_string)
print(type(my_dict))
print(type(resp_json))

输出说:两者都使用类'dict'

但是如前所述,我想确认两者是否完全相同,因为我需要发回一个 JSON 响应,如果两者完全相同,首先使用 json.dumps 将其转换为字符串是没有意义的( ) 然后再次对其执行 json.loads() 。我不妨返回我创建的字典对象 my_dict。希望我的问题很清楚。

【问题讨论】:

  • print 只显示类型的字符串表示,我猜这 可能 会产生误导。试试type(resp_json) == dict,你会发现它实际上是 that dict 类型。
  • 都是同一个字典
  • type(resp_json) == dict 返回 True
  • 如果您的字典是正确的响应,您为什么不直接返回它呢?它们不是“完全相同的东西”(resp_json is my_dict 返回False),但我不明白为什么这很重要。
  • 没有“字典格式的 json 对象”之类的东西。 json.loads() 接收一个字符串,如果它是一个正确的 json 对象的表示,它会在 python 字典中返回它的内容,因为它们是相似/兼容的类型。

标签: python json dictionary


【解决方案1】:

json 模块使用这个转换表

https://docs.python.org/2/library/json.html#json-to-py-table

+---------------+-----------+
|     JSON      |  Python   |
+---------------+-----------+
| object        | dict      |
| array         | list      |
| string        | unicode   |
| number (int)  | int, long |
| number (real) | float     |
| true          | True      |
| false         | False     |
| null          | None      |
+---------------+-----------+

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • @AlonsoDominguez 我添加了 ascii 表。没事吧?
【解决方案2】:

两者的类型都是dict,但它们不是同一个字典,也不一定完全相等。

例如,json 将包含 unicode 字符串。在 python 2 中,my_dict 不会(它将 str 类型)。在这种情况下,my_dict['key1']resp_json['key1'] 并不完全相同。

顺便说一句,对于大多数pythonic,这种差异应该无关紧要,您可能会认为它们是相同的。尽管如此,重要的是要记住可能存在的差异,并考虑您是否正在处理重要的边缘情况。

【讨论】:

  • 这也是我的预感,但我没有任何方法可以验证它。检查 - type(resp_json) == dict 和 isinstance(resp_json, type(my_dict)) 都返回 True
  • @UPCH 这是一个交互式示例,显示了我在 python 2 中所说的,键和值的类型不同:repl.it/repls/DodgerblueOddballKeyboardmapping
  • 你对 Python 2 中的 unicode 字符串是正确的,resp_json{u'key2': u'val2', u'key1': u'val1'} 但它仍然等于 ==my_dict
  • @tobias_k,这完全取决于您要寻找哪种质量。 Python 是鸭子类型的,通常任何类似字典的东西都应该足够好。但有时您可能只是在处理关心差异的边缘情况。在这种情况下,两者都是类型的字典。但也许这是内容是否相同的边缘情况。
  • 首先,我使用的是 Python3。其次,我想检查一下,因为我在最后做了一个 requests.post('myurl',resp_json) 。由于我将在多个地方执行此操作,因此要确保每次都执行 json.dumps() 和 json.loads() 是否真的需要。
【解决方案3】:

验证/检查 python 对象类型的首选方法是isintance()

isinstance(resp_json, type(my_dict))

然而,我怀疑这里的误解是另一个。

正如我在评论中指出的,json.loads() 返回一个字典,前提是传递了一个表示语法正确 JSON 的字符串。因此,dict 类型是正确的,因为这是 python 内置的以类似于 JS/JSON 的方式表示键值信息的方式。

如果你想知道它们是否是同一个对象,即存储在内存中的同一个地方,你可以使用

  resp_json is my_dict

从您的问题来看,但是我怀疑您真正感兴趣的是内容的等效性。

resp_json == mydict 

应该给你这个。我真的无法想象另一种情况,这很重要。

【讨论】:

  • 但这会返回True,即使 JSON dict 是某种特殊类型的 dict,一个添加大量附加信息或功能的子类。 IIUC,这正是 OP 想要找出的。
  • 返回“真”
  • @MTTI 真的很喜欢你的详细解释。我会将此响应发送回 requests.post()。就这一点而言,我认为两者的工作方式相同,requests.post('',resp_json) 或 requests.post('',my_dict)。
  • @UPCH 我认为这属于最后一类,这并不重要,比较只会增加计算开销。如果回答对你有帮助,请考虑采纳
猜你喜欢
  • 2014-05-01
  • 2016-01-14
  • 2011-06-13
  • 2016-10-20
  • 2011-10-30
  • 1970-01-01
  • 2016-03-25
  • 2014-01-26
  • 2017-07-18
相关资源
最近更新 更多