【问题标题】:Object_hook in json module doesn't seem to work as expectedjson 模块中的 Object_hook 似乎没有按预期工作
【发布时间】:2021-02-25 08:06:48
【问题描述】:

我有:

def decoder(o):
  return o.get("fruits")


array = '{"fruits": [{"apple": "red"}, {"banana": "yellow"}, "orange"]}'
data  = json.loads(array, object_hook=decoder)
print(data)

这是返回[None, None, 'orange']

但是,如果我在不使用 object_hook 的情况下执行以下操作

n = json.loads(array)
print(n.get("fruits"))

这会根据需要返回 [{'apple': 'red'}, {'banana': 'yellow'}, 'orange']

如何使用 object_hook 返回 [{'apple': 'red'}, {'banana': 'yellow'}, 'orange'] 而不是 [None, None, 'orange']?我的代码的哪一部分导致它返回 None?

【问题讨论】:

    标签: python json deserialization python-3.6


    【解决方案1】:

    将使用object_hook 的返回值代替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)
    
    

    【讨论】:

    • 非常感谢!这很有帮助。
    • 不客气,如果有用,您可以接受答案。 :)
    【解决方案2】:

    了解发生了什么的一个好方法是打印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 的值

    【讨论】:

    • 谢谢,这有助于我了解发生了什么。
    猜你喜欢
    • 2017-09-03
    • 2020-09-15
    • 2016-01-24
    • 1970-01-01
    • 2022-12-17
    • 2021-06-07
    • 2013-02-10
    • 2019-04-24
    • 1970-01-01
    相关资源
    最近更新 更多