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)