orjson は、Python 用の高速で正しい JSON ライブラリです。これは、JSON の最速の Python ライブラリとしてベンチマークされており、標準の JSON ライブラリや他のサードパーティ ライブラリよりも正確です。データクラス、日時、numpy、および UUID インスタンスをネイティブにシリアル化します。
orjson.dumps() はjson
の 10 倍程度の速度で、一般的な型とサブタイプをシリアル化し、呼び出し元が任意の型をシリアル化する方法を指定するためのdefault
パラメーターを持ち、出力を制御する多数のフラグを持ちます。
orjson.loads() はjson
の 2 倍程度の速度で、UTF-8 および RFC 8259 (「JavaScript Object Notation (JSON) データ交換形式」) に厳密に準拠しています。
ファイルや行区切りの JSON ファイルなどの読み取りと書き込みは、ライブラリでは提供されていません。
orjson は CPython 3.8、3.9、3.10、3.11、3.12、3.13、および 3.14 をサポートします。
Linux 用の amd64/x86_64、i686/x86、aarch64/armv8、arm7、POWER/ppc64le、および s390x ホイール、macOS 用の amd64 および aarch64 ホイール、Windows 用の amd64 および i686/x86 ホイールを配布します。
orjson は、PyPy、Android/iOS 用の組み込み Python ビルド、または PEP 554 サブインタープリターをサポートしませんし、今後もサポートしません。
リリースはセマンティック バージョニングに従い、オプトイン フラグを使用せずに新しいオブジェクト タイプをシリアル化することは重大な変更とみなされます。
orjson は、Apache 2.0 ライセンスと MIT ライセンスの両方に基づいてライセンスされています。リポジトリと問題トラッカーは github.com/ijl/orjson で、パッチはそこに送信できます。リポジトリに利用可能な CHANGELOG があります。
PyPI からホイールをインストールするには、 orjson
パッケージをインストールします。
requirements.in
またはrequirements.txt
形式で、次のように指定します。
orjson >= 3.10,<4
pyproject.toml
形式で、次のように指定します。
orjson = " ^3.10 "
ホイールを作成するには、パッケージを参照してください。
これは、オプションを指定したシリアル化と逆シリアル化の例です。
> >> import orjson , datetime , numpy
> >> data = {
"type" : "job" ,
"created_at" : datetime . datetime ( 1970 , 1 , 1 ),
"status" : "?" ,
"payload" : numpy . array ([[ 1 , 2 ], [ 3 , 4 ]]),
}
> >> orjson . dumps ( data , option = orjson . OPT_NAIVE_UTC | orjson . OPT_SERIALIZE_NUMPY )
b'{"type":"job","created_at":"1970-01-01T00:00:00+00:00","status":" xf0 x9f x86 x97 ","payload":[[1,2],[3,4]]}'
> >> orjson . loads ( _ )
{ 'type' : 'job' , 'created_at' : '1970-01-01T00:00:00+00:00' , 'status' : '?' , 'payload' : [[ 1 , 2 ], [ 3 , 4 ]]}
orjson バージョン 3 は、バージョン 2 よりも多くの型をシリアル化します。 str
、 int
、 dict
、およびlist
のサブクラスがシリアル化されるようになりました。これは高速で、標準ライブラリに似ています。 orjson.OPT_PASSTHROUGH_SUBCLASS
で無効にできます。 dataclasses.dataclass
インスタンスはデフォルトでシリアル化されるようになり、 option=orjson.OPT_PASSTHROUGH_DATACLASS
が指定されていない限り、 default
関数でカスタマイズできません。 uuid.UUID
インスタンスはデフォルトでシリアル化されます。現在シリアル化されている型については、 default
関数の実装とそれらを有効にするオプションは削除できますが、必ずしも削除する必要はありません。逆シリアル化には変更はありませんでした。
標準ライブラリから移行する場合の最大の違いは、 orjson.dumps
bytes
返すのに対し、 json.dumps
str
返すことです。
非str
キーを使用するdict
オブジェクトを持つユーザーは、 option=orjson.OPT_NON_STR_KEYS
を指定する必要があります。
sort_keys
、 option=orjson.OPT_SORT_KEYS
に置き換えられます。
indent
、 option=orjson.OPT_INDENT_2
に置き換えられ、他のレベルのインデントはサポートされません。
ensure_ascii
は現在ではおそらく関連性がなく、UTF-8 文字を ASCII にエスケープすることはできません。
def dumps (
__obj : Any ,
default : Optional [ Callable [[ Any ], Any ]] = ...,
option : Optional [ int ] = ...,
) -> bytes : ...
dumps()
Python オブジェクトを JSON にシリアル化します。
str
、 dict
、 list
、 tuple
、 int
、 float
、 bool
、 None
、 dataclasses.dataclass
、 typing.TypedDict
、 datetime.datetime
、 datetime.date
、 datetime.time
、 uuid.UUID
、 numpy.ndarray
、およびorjson.Fragment
インスタンス。これはdefault
を通じて任意の型をサポートします。 str
、 int
、 dict
、 list
、 dataclasses.dataclass
、およびenum.Enum
のサブクラスをシリアル化します。 namedtuple
オブジェクトを配列としてシリアル化することを避けるために、 tuple
のサブクラスはシリアル化されません。サブクラスのシリアル化を回避するには、 orjson.OPT_PASSTHROUGH_SUBCLASS
オプションを指定します。
出力は、UTF-8 を含むbytes
オブジェクトです。
グローバル インタープリタ ロック (GIL) は、通話中保持されます。
サポートされていない型ではJSONEncodeError
が発生します。この例外メッセージはType is not JSON serializable: ...
エラー メッセージとともに無効なオブジェクトを説明します。これを修正するには、デフォルトを指定します。
無効な UTF-8 が含まれるstr
ではJSONEncodeError
が発生します。
デフォルトで 64 ビットを超える整数、またはOPT_STRICT_INTEGER
を使用する場合は 53 ビットを超える整数に対してJSONEncodeError
発生します。
OPT_NON_STR_KEYS
が指定されていない限り、 dict
str
以外の型のキーがある場合、 JSONEncodeError
が発生します。
default
の出力が再帰的にdefault
で 254 レベルを超える深さの処理を行う場合、 JSONEncodeError
が発生します。
循環参照ではJSONEncodeError
が発生します。
datetime オブジェクトのtzinfo
がサポートされていない場合は、 JSONEncodeError
が発生します。
JSONEncodeError
TypeError
のサブクラスです。これは標準ライブラリとの互換性のためです。
失敗の原因がdefault
の例外である場合、 JSONEncodeError
元の例外を__cause__
として連鎖させます。
サブクラスまたは任意の型をシリアル化するには、サポートされている型を返す呼び出し可能オブジェクトとしてdefault
を指定します。 default
、関数、ラムダ、または呼び出し可能なクラスのインスタンスです。型がdefault
で処理されなかったことを指定するには、 TypeError
などの例外を発生させます。
> >> import orjson , decimal
> >>
def default ( obj ):
if isinstance ( obj , decimal . Decimal ):
return str ( obj )
raise TypeError
> >> orjson . dumps ( decimal . Decimal ( "0.0842389659712649442845" ))
JSONEncodeError : Type is not JSON serializable : decimal . Decimal
> >> orjson . dumps ( decimal . Decimal ( "0.0842389659712649442845" ), default = default )
b'"0.0842389659712649442845"'
> >> orjson . dumps ({ 1 , 2 }, default = default )
orjson . JSONEncodeError : Type is not JSON serializable : set
default
呼び出し可能オブジェクトは、例外が発生する前にdefault
で最大 254 回処理する必要があるオブジェクトを返す場合があります。
型を処理できない場合、 default
例外が発生することが重要です。それ以外の場合、Python は暗黙的にNone
返します。これは呼び出し元には正当な値のように見え、シリアル化されます。
> >> import orjson , json
> >>
def default ( obj ):
if isinstance ( obj , decimal . Decimal ):
return str ( obj )
> >> orjson . dumps ({ "set" :{ 1 , 2 }}, default = default )
b'{"set":null}'
> >> json . dumps ({ "set" :{ 1 , 2 }}, default = default )
'{"set":null}'
データのシリアル化方法を変更するには、 option
を指定します。各option
orjson
の整数定数です。複数のオプションを指定するには、それらをまとめてマスクします。たとえば、 option=orjson.OPT_STRICT_INTEGER | orjson.OPT_NAIVE_UTC
。
出力にn
追加します。これはdumps(...) + "n"
のパターンの利便性と最適化です。 bytes
オブジェクトは不変であり、このパターンは元の内容をコピーします。
> >> import orjson
> >> orjson . dumps ([])
b"[]"
> >> orjson . dumps ([], option = orjson . OPT_APPEND_NEWLINE )
b"[] n "
スペース 2 個のインデントを備えた整形出力。これは、標準ライブラリのindent=2
に相当します。 Pretty 印刷は遅くなり、出力は大きくなります。 orjson は、プリティ プリントで最も高速なライブラリであり、標準ライブラリよりもプリティ プリントの速度の低下がはるかに少ないです。このオプションは他のすべてのオプションと互換性があります。
> >> import orjson
> >> orjson . dumps ({ "a" : "b" , "c" : { "d" : True }, "e" : [ 1 , 2 ]})
b'{"a":"b","c":{"d":true},"e":[1,2]}'
> >> orjson . dumps (
{ "a" : "b" , "c" : { "d" : True }, "e" : [ 1 , 2 ]},
option = orjson . OPT_INDENT_2
)
b'{ n "a": "b", n "c": { n "d": true n }, n "e": [ n 1, n 2 n ] n }'
表示される場合、インデントと改行は次のように表示されます。
{
"a" : " b " ,
"c" : {
"d" : true
},
"e" : [
1 ,
2
]
}
これは、github.json フィクスチャをコンパクト (52KiB) またはきれい (64KiB) としてシリアル化することを測定します。
図書館 | コンパクト (ミリ秒) | かなり(ミリ秒) | vs. オージソン |
---|---|---|---|
オルジソン | 0.01 | 0.02 | 1 |
json | 0.13 | 0.54 | 34 |
これは、citm_catalog.json フィクスチャをコンパクト (489KiB) またはきれい (1.1MiB) としてシリアル化することを測定します。これはネストと改行の量による最悪のケースです。
図書館 | コンパクト (ミリ秒) | かなり(ミリ秒) | vs. オージソン |
---|---|---|---|
オルジソン | 0.25 | 0.45 | 1 |
json | 3.01 | 24.42 | 54.4 |
これは、 pyindent
スクリプトを使用して再現できます。
tzinfo
使用しないdatetime.datetime
オブジェクトを UTC としてシリアル化します。これは、 tzinfo
が設定されているdatetime.datetime
オブジェクトには影響しません。
> >> import orjson , datetime
> >> orjson . dumps (
datetime . datetime ( 1970 , 1 , 1 , 0 , 0 , 0 ),
)
b'"1970-01-01T00:00:00"'
> >> orjson . dumps (
datetime . datetime ( 1970 , 1 , 1 , 0 , 0 , 0 ),
option = orjson . OPT_NAIVE_UTC ,
)
b'"1970-01-01T00:00:00+00:00"'
str
以外の型のdict
キーをシリアル化します。これにより、 dict
キーをstr
、 int
、 float
、 bool
、 None
、 datetime.datetime
、 datetime.date
、 datetime.time
、 enum.Enum
、およびuuid.UUID
のいずれかにすることができます。比較のために、標準ライブラリはデフォルトでstr
、 int
、 float
、 bool
、またはNone
をシリアル化します。 orjson ベンチマークは、他のライブラリよりも非str
キーのシリアル化が速いと評価されています。このオプションは、 str
キーの場合、デフォルトよりも遅くなります。
> >> import orjson , datetime , uuid
> >> orjson . dumps (
{ uuid . UUID ( "7202d115-7ff3-4c81-a7c1-2a1f067b1ece" ): [ 1 , 2 , 3 ]},
option = orjson . OPT_NON_STR_KEYS ,
)
b'{"7202d115-7ff3-4c81-a7c1-2a1f067b1ece":[1,2,3]}'
> >> orjson . dumps (
{ datetime . datetime ( 1970 , 1 , 1 , 0 , 0 , 0 ): [ 1 , 2 , 3 ]},
option = orjson . OPT_NON_STR_KEYS | orjson . OPT_NAIVE_UTC ,
)
b'{"1970-01-01T00:00:00+00:00":[1,2,3]}'
これらの型は通常、値としてどのようになるかに基づいてシリアル化されます。たとえば、 datetime.datetime
は依然として RFC 3339 文字列であり、それに影響するオプションを尊重します。例外は、 int
シリアル化ではOPT_STRICT_INTEGER
考慮されないことです。
このオプションには重複キーが作成されるリスクがあります。これは、非str
オブジェクトが既存のキーと同じstr
にシリアル化される可能性があるためです (例: {"1": true, 1: false}
。 dict
に挿入される最後のキーは最後にシリアル化され、JSON デシリアライザーはおそらく最後に出現したキー (上記ではfalse
) を取得します。最初の値は失われます。
このオプションはorjson.OPT_SORT_KEYS
と互換性があります。ソートを使用する場合、ソートは不安定であり、重複キーが発生した場合は予測できないことに注意してください。
> >> import orjson , datetime
> >> orjson . dumps (
{ "other" : 1 , datetime . date ( 1970 , 1 , 5 ): 2 , datetime . date ( 1970 , 1 , 3 ): 3 },
option = orjson . OPT_NON_STR_KEYS | orjson . OPT_SORT_KEYS
)
b'{"1970-01-03":3,"1970-01-05":2,"other":1}'
これは、100 個のdict
のlist
で構成される 589KiB の JSON のシリアル化を測定します。各dict
には、エポック タイムスタンプを表す 365 個のランダムにソートされたint
キーと 1 つのstr
キーの両方があり、各キーの値は単一の整数です。 「str キー」では、キーはシリアル化前にstr
に変換され、orjson は引き続きoption=orjson.OPT_NON_STR_KEYS
指定します (これは常に多少遅くなります)。
図書館 | str キー (ミリ秒) | int キー (ミリ秒) | int キーのソート (ミリ秒) |
---|---|---|---|
オルジソン | 0.5 | 0.93 | 2.08 |
json | 2.72 | 3.59 |
json は空白です。これは、すべてのキーをstr
に変換する前に並べ替えようとするとTypeError
発生するためです。これは、 pynonstr
スクリプトを使用して再現できます。
datetime.datetime
およびdatetime.time
インスタンスのmicrosecond
フィールドをシリアル化しないでください。
> >> import orjson , datetime
> >> orjson . dumps (
datetime . datetime ( 1970 , 1 , 1 , 0 , 0 , 0 , 1 ),
)
b'"1970-01-01T00:00:00.000001"'
> >> orjson . dumps (
datetime . datetime ( 1970 , 1 , 1 , 0 , 0 , 0 , 1 ),
option = orjson . OPT_OMIT_MICROSECONDS ,
)
b'"1970-01-01T00:00:00"'
dataclasses.dataclass
インスタンスをdefault
にパススルーします。これにより出力をカスタマイズできますが、速度は大幅に遅くなります。
> >> import orjson , dataclasses
> >>
@ dataclasses . dataclass
class User :
id : str
name : str
password : str
def default ( obj ):
if isinstance ( obj , User ):
return { "id" : obj . id , "name" : obj . name }
raise TypeError
> >> orjson . dumps ( User ( "3b1" , "asd" , "zxc" ))
b'{"id":"3b1","name":"asd","password":"zxc"}'
> >> orjson . dumps ( User ( "3b1" , "asd" , "zxc" ), option = orjson . OPT_PASSTHROUGH_DATACLASS )
TypeError : Type is not JSON serializable : User
> >> orjson . dumps (
User ( "3b1" , "asd" , "zxc" ),
option = orjson . OPT_PASSTHROUGH_DATACLASS ,
default = default ,
)
b'{"id":"3b1","name":"asd"}'
datetime.datetime
、 datetime.date
、およびdatetime.time
インスタンスをdefault
にパススルーします。これにより、日時をカスタム形式 (HTTP 日付など) にシリアル化できます。
> >> import orjson , datetime
> >>
def default ( obj ):
if isinstance ( obj , datetime . datetime ):
return obj . strftime ( "%a, %d %b %Y %H:%M:%S GMT" )
raise TypeError
> >> orjson . dumps ({ "created_at" : datetime . datetime ( 1970 , 1 , 1 )})
b'{"created_at":"1970-01-01T00:00:00"}'
> >> orjson . dumps ({ "created_at" : datetime . datetime ( 1970 , 1 , 1 )}, option = orjson . OPT_PASSTHROUGH_DATETIME )
TypeError : Type is not JSON serializable : datetime . datetime
> >> orjson . dumps (
{ "created_at" : datetime . datetime ( 1970 , 1 , 1 )},
option = orjson . OPT_PASSTHROUGH_DATETIME ,
default = default ,
)
b'{"created_at":"Thu, 01 Jan 1970 00:00:00 GMT"}'
OPT_NON_STR_KEYS を使用している場合、これはdict
キーの日時には影響しません。
組み込み型のサブクラスをdefault
にパススルーします。
> >> import orjson
> >>
class Secret ( str ):
pass
def default ( obj ):
if isinstance ( obj , Secret ):
return "******"
raise TypeError
> >> orjson . dumps ( Secret ( "zxc" ))
b'"zxc"'
> >> orjson . dumps ( Secret ( "zxc" ), option = orjson . OPT_PASSTHROUGH_SUBCLASS )
TypeError : Type is not JSON serializable : Secret
> >> orjson . dumps ( Secret ( "zxc" ), option = orjson . OPT_PASSTHROUGH_SUBCLASS , default = default )
b'"******"'
OPT_NON_STR_KEYS を使用する場合、これはサブクラスをdict
キーとしてシリアル化することには影響しません。
これは非推奨であり、バージョン 3 では効果がありません。バージョン 2 では、これはdataclasses.dataclass
インスタンスをシリアル化するために必要でした。詳細については、「データクラス」を参照してください。
numpy.ndarray
インスタンスをシリアル化します。詳細については、「numpy」を参照してください。
これは非推奨であり、バージョン 3 では効果がありません。バージョン 2 では、これはuuid.UUID
インスタンスをシリアル化するために必要でした。詳細については、「UUID」を参照してください。
dict
キーをソートされた順序でシリアル化します。デフォルトでは、不特定の順序でシリアル化されます。これは、標準ライブラリのsort_keys=True
と同等です。
これを使用して、ハッシュまたはテストの順序が決定的であることを確認できます。これはパフォーマンスに重大な影響を与えるため、一般には推奨されません。
> >> import orjson
> >> orjson . dumps ({ "b" : 1 , "c" : 2 , "a" : 3 })
b'{"b":1,"c":2,"a":3}'
> >> orjson . dumps ({ "b" : 1 , "c" : 2 , "a" : 3 }, option = orjson . OPT_SORT_KEYS )
b'{"a":3,"b":1,"c":2}'
これは、twitter.json フィクスチャをソートしない場合とソートする場合のシリアル化を測定します。
図書館 | 未ソート (ミリ秒) | ソート済み (ミリ秒) | vs. オージソン |
---|---|---|---|
オルジソン | 0.11 | 0.3 | 1 |
json | 1.36 | 1.93 | 6.4 |
ベンチマークは、 pysort
スクリプトを使用して再現できます。
並べ替えは照合順序/ロケールを意識しません。
> >> import orjson
> >> orjson . dumps ({ "a" : 1 , "ä" : 2 , "A" : 3 }, option = orjson . OPT_SORT_KEYS )
b'{"A":3,"a":1," xc3 xa4 ":2}'
これは、標準ライブラリと同じ並べ替え動作です。
dataclass
もマップとしてシリアル化されますが、これはマップには影響しません。
整数に 53 ビット制限を適用します。それ以外の場合、制限は 64 ビットで、Python 標準ライブラリと同じです。詳細については、「int」を参照してください。
datetime.datetime
インスタンスの UTC タイムゾーンを+00:00
ではなくZ
としてシリアル化します。
> >> import orjson , datetime , zoneinfo
> >> orjson . dumps (
datetime . datetime ( 1970 , 1 , 1 , 0 , 0 , 0 , tzinfo = zoneinfo . ZoneInfo ( "UTC" )),
)
b'"1970-01-01T00:00:00+00:00"'
> >> orjson . dumps (
datetime . datetime ( 1970 , 1 , 1 , 0 , 0 , 0 , tzinfo = zoneinfo . ZoneInfo ( "UTC" )),
option = orjson . OPT_UTC_Z
)
b'"1970-01-01T00:00:00Z"'
orjson.Fragment
は、ドキュメント内にすでにシリアル化された JSON が含まれています。これは、最初にloads()
を介して Python オブジェクトに逆シリアル化せずに、キャッシュ、JSONB フィールド、または個別にシリアル化されたオブジェクトから JSON BLOB を組み込む効率的な方法です。
> >> import orjson
> >> orjson . dumps ({ "key" : "zxc" , "data" : orjson . Fragment ( b'{"a": "b", "c": 1}' )})
b'{"key":"zxc","data":{"a": "b", "c": 1}}'
再フォーマットは行われません。orjson.OPT_INDENT_2 orjson.OPT_INDENT_2
コンパクト BLOB に影響を与えず、きれいに印刷された JSON BLOB がコンパクトとして書き換えられることもありません。
入力はbytes
またはstr
であり、位置引数として指定する必要があります。
str
が指定され、入力が有効な UTF-8 ではない場合、これによりorjson.JSONEncodeError
が発生します。それ以外の場合は検証が行われず、無効な JSON が書き込まれる可能性があります。これは文字をエスケープしません。この実装は、無効な文字列または無効な JSON が指定された場合にクラッシュしないようにテストされています。
def loads ( __obj : Union [ bytes , bytearray , memoryview , str ]) -> Any : ...
loads()
JSON を Python オブジェクトに逆シリアル化します。これは、 dict
、 list
、 int
、 float
、 str
、 bool
、およびNone
オブジェクトに逆シリアル化されます。
bytes
、 bytearray
、 memoryview
、およびstr
入力が受け入れられます。入力がmemoryview
、 bytearray
、またはbytes
オブジェクトとして存在する場合は、不必要なstr
オブジェクトを作成するのではなく、これらを直接渡すことをお勧めします。つまり、 orjson.loads(b"{} orjson.loads(b"{}".decode("utf-8"))
orjson.loads(b"{}")
です。これにより、メモリ使用量と遅延が少なくなります。
入力は有効な UTF-8 である必要があります。
orjson は、プロセスの間、マップ キーのキャッシュを維持します。これにより、重複する文字列が回避されるため、メモリ使用量が実質的に削減されます。キャッシュされるキーは最大 64 バイトである必要があり、2048 個のエントリが保存されます。
グローバル インタープリタ ロック (GIL) は、通話中保持されます。
無効な型または無効な JSON が指定された場合、 JSONDecodeError
が発生します。これには、入力にNaN
、 Infinity
、または-Infinity
含まれている場合が含まれます。これらは標準ライブラリでは許可されていますが、有効な JSON ではありません。
配列またはオブジェクトの組み合わせが 1024 レベルの深さで再帰されると、 JSONDecodeError
が発生します。
JSONDecodeError
json.JSONDecodeError
およびValueError
のサブクラスです。これは標準ライブラリとの互換性のためです。
orjson は、 dataclasses.dataclass
のインスタンスをネイティブにシリアル化します。他のライブラリの 40 ~ 50 倍の速さでインスタンスをシリアル化し、 dict
のシリアル化と比較して他のライブラリで見られる深刻な速度の低下を回避します。
__slots__
を使用するデータクラス、凍結されたデータクラス、オプションまたはデフォルトの属性を持つデータクラス、およびサブクラスを含む、データクラスのすべてのバリアントを渡すことがサポートされています。 __slots__
使用しないことにはパフォーマンス上の利点があります。
図書館 | 辞書 (ミリ秒) | データクラス (ミリ秒) | vs. オージソン |
---|---|---|---|
オルジソン | 0.43 | 0.95 | 1 |
json | 5.81 | 38.32 | 40 |
これは、 dataclasses.asdict()
の出力をシリアル化するためにdefault
を使用して、555KiB の JSON、orjson をネイティブにシリアル化し、その他のライブラリを測定します。これは、 pydataclass
スクリプトを使用して再現できます。
データクラスはマップとしてシリアル化され、すべての属性がクラス定義で指定された順序でシリアル化されます。
> >> import dataclasses , orjson , typing
@ dataclasses . dataclass
class Member :
id : int
active : bool = dataclasses . field ( default = False )
@ dataclasses . dataclass
class Object :
id : int
name : str
members : typing . List [ Member ]
> >> orjson . dumps ( Object ( 1 , "a" , [ Member ( 1 , True ), Member ( 2 )]))
b'{"id":1,"name":"a","members":[{"id":1,"active":true},{"id":2,"active":false}]}'
orjson は、 datetime.datetime
オブジェクトを RFC 3339 形式 (例: "1970-01-01T00:00:00+00:00") にシリアル化します。これは ISO 8601 のサブセットであり、標準ライブラリのisoformat()
と互換性があります。
> >> import orjson , datetime , zoneinfo
> >> orjson . dumps (
datetime . datetime ( 2018 , 12 , 1 , 2 , 3 , 4 , 9 , tzinfo = zoneinfo . ZoneInfo ( "Australia/Adelaide" ))
)
b'"2018-12-01T02:03:04.000009+10:30"'
> >> orjson . dumps (
datetime . datetime ( 2100 , 9 , 1 , 21 , 55 , 2 ). replace ( tzinfo = zoneinfo . ZoneInfo ( "UTC" ))
)
b'"2100-09-01T21:55:02+00:00"'
> >> orjson . dumps (
datetime . datetime ( 2100 , 9 , 1 , 21 , 55 , 2 )
)
b'"2100-09-01T21:55:02"'
datetime.datetime
、 None
、 datetime.timezone.utc
、 python3.9 以降のzoneinfo
モジュールからのタイムゾーン インスタンス、またはサードパーティのpendulum
、 pytz
、またはdateutil
/ arrow
ライブラリからのタイムゾーン インスタンスのtzinfo
を持つインスタンスをサポートします。
タイムゾーンには標準ライブラリのzoneinfo.ZoneInfo
使用するのが最も速いです。
datetime.time
オブジェクトにはtzinfo
含めることはできません。
> >> import orjson , datetime
> >> orjson . dumps ( datetime . time ( 12 , 0 , 15 , 290 ))
b'"12:00:15.000290"'
datetime.date
オブジェクトは常にシリアル化されます。
> >> import orjson , datetime
> >> orjson . dumps ( datetime . date ( 1900 , 1 , 2 ))
b'"1900-01-02"'
tzinfo
でエラーが発生すると、 JSONEncodeError
が発生します。
datetime
オブジェクトのシリアル化を無効にするには、オプションorjson.