0

我需要将 python 对象序列化为 JSON,并且很难将时间计数器转换为 JSON-play-nice 形式

说我有这样的事情:

 01:20:24    # hh:mm:ss

这是我正在增加的时间计数器,而我的脚本正在运行。

完成后,我需要转换为 JSON。

我目前正在尝试这个:

dthandler = lambda obj: obj.isoformat() if isinstance(obj, time) else None
this_object["totaltime"] = json.dumps(this_object["totaltime"], default=dthandler)

但我收到一个错误,time因为它不是有效的class, type, or tuple of classes and types

问题:
我如何序列化这个?是否有一个可能的“默认类型”列表来查询(Python新手......非常缺少Javascript typeof)

谢谢!

4

2 回答 2

1

听起来您的time变量不是您认为的那样(可能是指time模块而不是类?)。

但是,最好根本不进行实例检查,因为它相当不合 Python。“最好请求原谅……”

def dthandler(obj):
    try:
        return obj.isoformat()
    except AttributeError:
        return None

这完全避免了丑陋的类型检查,因为你真正想要的是“如果可以的话,返回 isoformat 结果;否则返回 None”。

于 2013-03-06T16:02:05.187 回答
1

这不是 JSON 问题;您的time参考不是您认为的那样。

确保datetime.time那里有一个对象,而不是time模块,例如:

>>> import datetime
>>> import time
>>> ref = datetime.time(10, 20)
>>> isinstance(ref, time)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
>>> isinstance(ref, datetime.time)
True

如果您使用正确的类型进行测试,则一切正常:

>>> import json
>>> dthandler = lambda obj: obj.isoformat() if isinstance(obj, datetime.time) else None
>>> json.dumps(ref, default=dthandler)
'"10:20:00"'

请注意,文档希望处理程序引发 aTypeError而不是返回None; 这样不可序列化的对象至少被视为错误:

def dthandler(o):
    try:
        return o.isoformat()
    except AttributeError:
        raise TypeError

会更加Pythonic和正确。

于 2013-03-06T15:58:00.163 回答