json 模块中的 Object_hook 似乎没有按预期工作
Object_hook in json module doesn't seem to work as expected
我有:
def decoder(o):
return o.get("fruits")
array = '{"fruits": [{"apple": "red"}, {"banana": "yellow"}, "orange"]}'
data = json.loads(array, object_hook=decoder)
print(data)
这是 returning [None, None, 'orange']
。
但是,如果我在不使用 object_hook
的情况下执行以下操作
n = json.loads(array)
print(n.get("fruits"))
这 returns [{'apple': 'red'}, {'banana': 'yellow'}, 'orange']
随心所欲。
如何使用 object_hook 到 return [{'apple': 'red'}, {'banana': 'yellow'}, 'orange']
而不是 [None, None, 'orange']
?我的代码的哪一部分导致它 return None?
了解发生了什么的一个好方法是打印 o
:
{'apple': 'red'}
{'banana': 'yellow'}
{'fruits': [None, None, 'orange']}
[None, None, 'orange']
现在看来谜底已经解开了。至于如何解决,我认为不应该那样使用。您当然可以保留当前拥有的代码,然后过滤列表中所有不是 None
的元素,例如:
result_list = [x if x is not None for x in result_list]
其中 result_list
存储来自 json.loads
的值
将使用 object_hook
的 return 值代替 dict
Notice: return value of object_hook would replace all dict object in your json string
# the reason you get None:
# 1 inner dict {"apple": "red"} apply "object_hook"
# 2 return o.get("fruits") --> None
您可以尝试使用以下代码供您参考:
import json
def decoder(o):
if o.get("fruits"):
return o["fruits"]
return o
array = '{"fruits": [{"apple": "red"}, {"banana": "yellow"}, "orange"]}'
data = json.loads(array, object_hook=decoder)
print(data)
我有:
def decoder(o):
return o.get("fruits")
array = '{"fruits": [{"apple": "red"}, {"banana": "yellow"}, "orange"]}'
data = json.loads(array, object_hook=decoder)
print(data)
这是 returning [None, None, 'orange']
。
但是,如果我在不使用 object_hook
的情况下执行以下操作n = json.loads(array)
print(n.get("fruits"))
这 returns [{'apple': 'red'}, {'banana': 'yellow'}, 'orange']
随心所欲。
如何使用 object_hook 到 return [{'apple': 'red'}, {'banana': 'yellow'}, 'orange']
而不是 [None, None, 'orange']
?我的代码的哪一部分导致它 return None?
了解发生了什么的一个好方法是打印 o
:
{'apple': 'red'}
{'banana': 'yellow'}
{'fruits': [None, None, 'orange']}
[None, None, 'orange']
现在看来谜底已经解开了。至于如何解决,我认为不应该那样使用。您当然可以保留当前拥有的代码,然后过滤列表中所有不是 None
的元素,例如:
result_list = [x if x is not None for x in result_list]
其中 result_list
存储来自 json.loads
将使用 object_hook
的 return 值代替 dict
Notice: return value of object_hook would replace all dict object in your json string
# the reason you get None:
# 1 inner dict {"apple": "red"} apply "object_hook"
# 2 return o.get("fruits") --> None
您可以尝试使用以下代码供您参考:
import json
def decoder(o):
if o.get("fruits"):
return o["fruits"]
return o
array = '{"fruits": [{"apple": "red"}, {"banana": "yellow"}, "orange"]}'
data = json.loads(array, object_hook=decoder)
print(data)