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

質問:
これをシリアル化するにはどうすればよいですか?そして、クエリする可能性のある「default-types」のリストはありますか(Python初心者... Javascript typeofがまったくありません)

ありがとう!

4

2 に答える 2

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"'

ドキュメントでは、ハンドラーが;TypeErrorを返す代わりに発生することを想定していることに注意してください。Noneそうすれば、シリアル化できないオブジェクトは少なくともエラーとして扱われます。

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

よりPythonicで正しいでしょう。

于 2013-03-06T15:58:00.163 に答える
1

あなたのtime変数はあなたが思っているものではないように聞こえます(多分timeクラスの代わりにモジュールを参照していますか?)。

ただし、インスタンスはかなり非Pythonであるため、インスタンスをまったくチェックしない方がよいでしょう。「許しを請うほうがいい…」

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

これにより、醜い型チェックを完全に回避できます。本当に必要なのは、「可能であればアイソフォーマットの結果を返す、それ以外の場合はNoneを返す」ことだからです。

于 2013-03-06T16:02:05.187 に答える