Skip to main content

Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy

Project description

orjson

orjson is a fast, correct JSON library for Python. It benchmarks as the fastest Python library for JSON and is more correct than the standard json library or other third-party libraries. It serializes dataclass, datetime, numpy, and UUID instances natively.

Its features and drawbacks compared to other Python JSON libraries:

  • serializes dataclass instances 40-50x as fast as other libraries
  • serializes datetime, date, and time instances to RFC 3339 format, e.g., "1970-01-01T00:00:00+00:00"
  • serializes numpy.ndarray instances 4-12x as fast with 0.3x the memory usage of other libraries
  • pretty prints 10x to 20x as fast as the standard library
  • serializes to bytes rather than str, i.e., is not a drop-in replacement
  • serializes str without escaping unicode to ASCII, e.g., "好" rather than "\\u597d"
  • serializes float 10x as fast and deserializes twice as fast as other libraries
  • serializes subclasses of str, int, list, and dict natively, requiring default to specify how to serialize others
  • serializes arbitrary types using a default hook
  • has strict UTF-8 conformance, more correct than the standard library
  • has strict JSON conformance in not supporting Nan/Infinity/-Infinity
  • has an option for strict JSON conformance on 53-bit integers with default support for 64-bit
  • does not provide load() or dump() functions for reading from/writing to file-like objects

orjson supports CPython 3.7, 3.8, 3.9, 3.10, and 3.11. It distributes x86_64/amd64, aarch64/armv8, and arm7 wheels for Linux, amd64 and aarch64 wheels for macOS, and amd64 wheels for Windows. orjson does not support PyPy. Releases follow semantic versioning and serializing a new object type without an opt-in flag is considered a breaking change.

orjson is licensed under both the Apache 2.0 and MIT licenses. The repository and issue tracker is github.com/ijl/orjson, and patches may be submitted there. There is a CHANGELOG available in the repository.

  1. Usage
    1. Install
    2. Quickstart
    3. Migrating
    4. Serialize
      1. default
      2. option
    5. Deserialize
  2. Types
    1. dataclass
    2. datetime
    3. enum
    4. float
    5. int
    6. numpy
    7. str
    8. uuid
  3. Testing
  4. Performance
    1. Latency
    2. Memory
    3. Reproducing
  5. Questions
  6. Packaging
  7. License

Usage

Install

To install a wheel from PyPI:

pip install --upgrade "pip>=20.3" # manylinux_x_y, universal2 wheel support
pip install --upgrade orjson

To build a wheel, see packaging.

Quickstart

This is an example of serializing, with options specified, and deserializing:

>>> 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]]}

Migrating

orjson version 3 serializes more types than version 2. Subclasses of str, int, dict, and list are now serialized. This is faster and more similar to the standard library. It can be disabled with orjson.OPT_PASSTHROUGH_SUBCLASS.dataclasses.dataclass instances are now serialized by default and cannot be customized in a default function unless option=orjson.OPT_PASSTHROUGH_DATACLASS is specified. uuid.UUID instances are serialized by default. For any type that is now serialized, implementations in a default function and options enabling them can be removed but do not need to be. There was no change in deserialization.

To migrate from the standard library, the largest difference is that orjson.dumps returns bytes and json.dumps returns a str. Users with dict objects using non-str keys should specify option=orjson.OPT_NON_STR_KEYS. sort_keys is replaced by option=orjson.OPT_SORT_KEYS. indent is replaced by option=orjson.OPT_INDENT_2 and other levels of indentation are not supported.

Serialize

def dumps(
    __obj: Any,
    default: Optional[Callable[[Any], Any]] = ...,
    option: Optional[int] = ...,
) -> bytes: ...

dumps() serializes Python objects to JSON.

It natively serializes str, dict, list, tuple, int, float, bool, dataclasses.dataclass, typing.TypedDict, datetime.datetime, datetime.date, datetime.time, uuid.UUID, numpy.ndarray, and None instances. It supports arbitrary types through default. It serializes subclasses of str, int, dict, list, dataclasses.dataclass, and enum.Enum. It does not serialize subclasses of tuple to avoid serializing namedtuple objects as arrays. To avoid serializing subclasses, specify the option orjson.OPT_PASSTHROUGH_SUBCLASS.

The output is a bytes object containing UTF-8.

The global interpreter lock (GIL) is held for the duration of the call.

It raises JSONEncodeError on an unsupported type. This exception message describes the invalid object with the error message Type is not JSON serializable: .... To fix this, specify default.

It raises JSONEncodeError on a str that contains invalid UTF-8.

It raises JSONEncodeError on an integer that exceeds 64 bits by default or, with OPT_STRICT_INTEGER, 53 bits.

It raises JSONEncodeError if a dict has a key of a type other than str, unless OPT_NON_STR_KEYS is specified.

It raises JSONEncodeError if the output of default recurses to handling by default more than 254 levels deep.

It raises JSONEncodeError on circular references.

It raises JSONEncodeError if a tzinfo on a datetime object is unsupported.

JSONEncodeError is a subclass of TypeError. This is for compatibility with the standard library.

default

To serialize a subclass or arbitrary types, specify default as a callable that returns a supported type. default may be a function, lambda, or callable class instance. To specify that a type was not handled by default, raise an exception such as 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

The default callable may return an object that itself must be handled by default up to 254 times before an exception is raised.

It is important that default raise an exception if a type cannot be handled. Python otherwise implicitly returns None, which appears to the caller like a legitimate value and is serialized:

>>> import orjson, json, rapidjson
>>>
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}'
>>> rapidjson.dumps({"set":{1, 2}}, default=default)
'{"set":null}'

option

To modify how data is serialized, specify option. Each option is an integer constant in orjson. To specify multiple options, mask them together, e.g., option=orjson.OPT_STRICT_INTEGER | orjson.OPT_NAIVE_UTC.

OPT_APPEND_NEWLINE

Append \n to the output. This is a convenience and optimization for the pattern of dumps(...) + "\n". bytes objects are immutable and this pattern copies the original contents.

>>> import orjson
>>> orjson.dumps([])
b"[]"
>>> orjson.dumps([], option=orjson.OPT_APPEND_NEWLINE)
b"[]\n"
OPT_INDENT_2

Pretty-print output with an indent of two spaces. This is equivalent to indent=2 in the standard library. Pretty printing is slower and the output larger. orjson is the fastest compared library at pretty printing and has much less of a slowdown to pretty print than the standard library does. This option is compatible with all other options.

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

If displayed, the indentation and linebreaks appear like this:

{
  "a": "b",
  "c": {
    "d": true
  },
  "e": [
    1,
    2
  ]
}

This measures serializing the github.json fixture as compact (52KiB) or pretty (64KiB):

Library compact (ms) pretty (ms) vs. orjson
orjson 0.03 0.04 1
ujson 0.18 0.19 4.6
rapidjson 0.1 0.12 2.9
simplejson 0.25 0.89 21.4
json 0.18 0.71 17

This measures serializing the citm_catalog.json fixture, more of a worst case due to the amount of nesting and newlines, as compact (489KiB) or pretty (1.1MiB):

Library compact (ms) pretty (ms) vs. orjson
orjson 0.59 0.71 1
ujson 2.9 3.59 5
rapidjson 1.81 2.8 3.9
simplejson 10.43 42.13 59.1
json 4.16 33.42 46.9

This can be reproduced using the pyindent script.

OPT_NAIVE_UTC

Serialize datetime.datetime objects without a tzinfo as UTC. This has no effect on datetime.datetime objects that have tzinfo set.

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

Serialize dict keys of type other than str. This allows dict keys to be one of str, int, float, bool, None, datetime.datetime, datetime.date, datetime.time, enum.Enum, and uuid.UUID. For comparison, the standard library serializes str, int, float, bool or None by default. orjson benchmarks as being faster at serializing non-str keys than other libraries. This option is slower for str keys than the default.

>>> 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]}'

These types are generally serialized how they would be as values, e.g., datetime.datetime is still an RFC 3339 string and respects options affecting it. The exception is that int serialization does not respect OPT_STRICT_INTEGER.

This option has the risk of creating duplicate keys. This is because non-str objects may serialize to the same str as an existing key, e.g., {"1": true, 1: false}. The last key to be inserted to the dict will be serialized last and a JSON deserializer will presumably take the last occurrence of a key (in the above, false). The first value will be lost.

This option is compatible with orjson.OPT_SORT_KEYS. If sorting is used, note the sort is unstable and will be unpredictable for duplicate 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}'

This measures serializing 589KiB of JSON comprising a list of 100 dict in which each dict has both 365 randomly-sorted int keys representing epoch timestamps as well as one str key and the value for each key is a single integer. In "str keys", the keys were converted to str before serialization, and orjson still specifes option=orjson.OPT_NON_STR_KEYS (which is always somewhat slower).

Library str keys (ms) int keys (ms) int keys sorted (ms)
orjson 1.53 2.16 4.29
ujson 3.07 5.65
rapidjson 4.29
simplejson 11.24 14.50 21.86
json 7.17 8.49

ujson is blank for sorting because it segfaults. json is blank because it raises TypeError on attempting to sort before converting all keys to str. rapidjson is blank because it does not support non-str keys. This can be reproduced using the pynonstr script.

OPT_OMIT_MICROSECONDS

Do not serialize the microsecond field on datetime.datetime and datetime.time instances.

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

Passthrough dataclasses.dataclass instances to default. This allows customizing their output but is much slower.

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

Passthrough datetime.datetime, datetime.date, and datetime.time instances to default. This allows serializing datetimes to a custom format, e.g., HTTP dates:

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

This does not affect datetimes in dict keys if using OPT_NON_STR_KEYS.

OPT_PASSTHROUGH_SUBCLASS

Passthrough subclasses of builtin types to 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'"******"'

This does not affect serializing subclasses as dict keys if using OPT_NON_STR_KEYS.

OPT_SERIALIZE_DATACLASS

This is deprecated and has no effect in version 3. In version 2 this was required to serialize dataclasses.dataclass instances. For more, see dataclass.

OPT_SERIALIZE_NUMPY

Serialize numpy.ndarray instances. For more, see numpy.

OPT_SERIALIZE_UUID

This is deprecated and has no effect in version 3. In version 2 this was required to serialize uuid.UUID instances. For more, see UUID.

OPT_SORT_KEYS

Serialize dict keys in sorted order. The default is to serialize in an unspecified order. This is equivalent to sort_keys=True in the standard library.

This can be used to ensure the order is deterministic for hashing or tests. It has a substantial performance penalty and is not recommended in general.

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

This measures serializing the twitter.json fixture unsorted and sorted:

Library unsorted (ms) sorted (ms) vs. orjson
orjson 0.32 0.54 1
ujson 1.6 2.07 3.8
rapidjson 1.12 1.65 3.1
simplejson 2.25 3.13 5.8
json 1.78 2.32 4.3

The benchmark can be reproduced using the pysort script.

The sorting is not collation/locale-aware:

>>> import orjson
>>> orjson.dumps({"a": 1, "ä": 2, "A": 3}, option=orjson.OPT_SORT_KEYS)
b'{"A":3,"a":1,"\xc3\xa4":2}'

This is the same sorting behavior as the standard library, rapidjson, simplejson, and ujson.

dataclass also serialize as maps but this has no effect on them.

OPT_STRICT_INTEGER

Enforce 53-bit limit on integers. The limit is otherwise 64 bits, the same as the Python standard library. For more, see int.

OPT_UTC_Z

Serialize a UTC timezone on datetime.datetime instances as Z instead of +00:00.

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

Deserialize

def loads(__obj: Union[bytes, bytearray, memoryview, str]) -> Any: ...

loads() deserializes JSON to Python objects. It deserializes to dict, list, int, float, str, bool, and None objects.

bytes, bytearray, memoryview, and str input are accepted. If the input exists as a memoryview, bytearray, or bytes object, it is recommended to pass these directly rather than creating an unnecessary str object. That is, orjson.loads(b"{}") instead of orjson.loads(b"{}".decode("utf-8")). This has lower memory usage and lower latency.

The input must be valid UTF-8.

orjson maintains a cache of map keys for the duration of the process. This causes a net reduction in memory usage by avoiding duplicate strings. The keys must be at most 64 bytes to be cached and 1024 entries are stored.

The global interpreter lock (GIL) is held for the duration of the call.

It raises JSONDecodeError if given an invalid type or invalid JSON. This includes if the input contains NaN, Infinity, or -Infinity, which the standard library allows, but is not valid JSON.

JSONDecodeError is a subclass of json.JSONDecodeError and ValueError. This is for compatibility with the standard library.

Types

dataclass

orjson serializes instances of dataclasses.dataclass natively. It serializes instances 40-50x as fast as other libraries and avoids a severe slowdown seen in other libraries compared to serializing dict.

It is supported to pass all variants of dataclasses, including dataclasses using __slots__, frozen dataclasses, those with optional or default attributes, and subclasses. There is a performance benefit to not using __slots__.

Library dict (ms) dataclass (ms) vs. orjson
orjson 1.40 1.60 1
ujson
rapidjson 3.64 68.48 42
simplejson 14.21 92.18 57
json 13.28 94.90 59

This measures serializing 555KiB of JSON, orjson natively and other libraries using default to serialize the output of dataclasses.asdict(). This can be reproduced using the pydataclass script.

Dataclasses are serialized as maps, with every attribute serialized and in the order given on class definition:

>>> 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}]}'

datetime

orjson serializes datetime.datetime objects to RFC 3339 format, e.g., "1970-01-01T00:00:00+00:00". This is a subset of ISO 8601 and is compatible with isoformat() in the standard library.

>>> 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 supports instances with a tzinfo that is None, datetime.timezone.utc, a timezone instance from the python3.9+ zoneinfo module, or a timezone instance from the third-party pendulum, pytz, or dateutil/arrow libraries.

It is fastest to use the standard library's zoneinfo.ZoneInfo for timezones.

datetime.time objects must not have a tzinfo.

>>> import orjson, datetime
>>> orjson.dumps(datetime.time(12, 0, 15, 290))
b'"12:00:15.000290"'

datetime.date objects will always serialize.

>>> import orjson, datetime
>>> orjson.dumps(datetime.date(1900, 1, 2))
b'"1900-01-02"'

Errors with tzinfo result in JSONEncodeError being raised.

To disable serialization of datetime objects specify the option orjson.OPT_PASSTHROUGH_DATETIME.

To use "Z" suffix instead of "+00:00" to indicate UTC ("Zulu") time, use the option orjson.OPT_UTC_Z.

To assume datetimes without timezone are UTC, use the option orjson.OPT_NAIVE_UTC.

enum

orjson serializes enums natively. Options apply to their values.

>>> import enum, datetime, orjson
>>>
class DatetimeEnum(enum.Enum):
    EPOCH = datetime.datetime(1970, 1, 1, 0, 0, 0)
>>> orjson.dumps(DatetimeEnum.EPOCH)
b'"1970-01-01T00:00:00"'
>>> orjson.dumps(DatetimeEnum.EPOCH, option=orjson.OPT_NAIVE_UTC)
b'"1970-01-01T00:00:00+00:00"'

Enums with members that are not supported types can be serialized using default:

>>> import enum, orjson
>>>
class Custom:
    def __init__(self, val):
        self.val = val

def default(obj):
    if isinstance(obj, Custom):
        return obj.val
    raise TypeError

class CustomEnum(enum.Enum):
    ONE = Custom(1)

>>> orjson.dumps(CustomEnum.ONE, default=default)
b'1'

float

orjson serializes and deserializes double precision floats with no loss of precision and consistent rounding.

orjson.dumps() serializes Nan, Infinity, and -Infinity, which are not compliant JSON, as null:

>>> import orjson, ujson, rapidjson, json
>>> orjson.dumps([float("NaN"), float("Infinity"), float("-Infinity")])
b'[null,null,null]'
>>> ujson.dumps([float("NaN"), float("Infinity"), float("-Infinity")])
OverflowError: Invalid Inf value when encoding double
>>> rapidjson.dumps([float("NaN"), float("Infinity"), float("-Infinity")])
'[NaN,Infinity,-Infinity]'
>>> json.dumps([float("NaN"), float("Infinity"), float("-Infinity")])
'[NaN, Infinity, -Infinity]'

int

orjson serializes and deserializes 64-bit integers by default. The range supported is a signed 64-bit integer's minimum (-9223372036854775807) to an unsigned 64-bit integer's maximum (18446744073709551615). This is widely compatible, but there are implementations that only support 53-bits for integers, e.g., web browsers. For those implementations, dumps() can be configured to raise a JSONEncodeError on values exceeding the 53-bit range.

>>> import orjson
>>> orjson.dumps(9007199254740992)
b'9007199254740992'
>>> orjson.dumps(9007199254740992, option=orjson.OPT_STRICT_INTEGER)
JSONEncodeError: Integer exceeds 53-bit range
>>> orjson.dumps(-9007199254740992, option=orjson.OPT_STRICT_INTEGER)
JSONEncodeError: Integer exceeds 53-bit range

numpy

orjson natively serializes numpy.ndarray and individual numpy.float64, numpy.float32, numpy.int64, numpy.int32, numpy.int16, numpy.int8, numpy.uint64, numpy.uint32, numpy.uint16, numpy.uint8, numpy.uintp, or numpy.intp, and numpy.datetime64 instances.

orjson is faster than all compared libraries at serializing numpy instances. Serializing numpy data requires specifying option=orjson.OPT_SERIALIZE_NUMPY.

>>> import orjson, numpy
>>> orjson.dumps(
        numpy.array([[1, 2, 3], [4, 5, 6]]),
        option=orjson.OPT_SERIALIZE_NUMPY,
)
b'[[1,2,3],[4,5,6]]'

The array must be a contiguous C array (C_CONTIGUOUS) and one of the supported datatypes.

Note a difference between serializing numpy.float32 using ndarray.tolist() or orjson.dumps(..., option=orjson.OPT_SERIALIZE_NUMPY): tolist() converts to a double before serializing and orjson's native path does not. This can result in different rounding.

numpy.datetime64 instances are serialized as RFC 3339 strings and datetime options affect them.

>>> import orjson, numpy
>>> orjson.dumps(
        numpy.datetime64("2021-01-01T00:00:00.172"),
        option=orjson.OPT_SERIALIZE_NUMPY,
)
b'"2021-01-01T00:00:00.172000"'
>>> orjson.dumps(
        numpy.datetime64("2021-01-01T00:00:00.172"),
        option=(
            orjson.OPT_SERIALIZE_NUMPY |
            orjson.OPT_NAIVE_UTC |
            orjson.OPT_OMIT_MICROSECONDS
        ),
)
b'"2021-01-01T00:00:00+00:00"'

If an array is not a contiguous C array, contains an unsupported datatype, or contains a numpy.datetime64 using an unsupported representation (e.g., picoseconds), orjson falls through to default. In default, obj.tolist() can be specified. If an array is malformed, which is not expected, orjson.JSONEncodeError is raised.

This measures serializing 92MiB of JSON from an numpy.ndarray with dimensions of (50000, 100) and numpy.float64 values:

Library Latency (ms) RSS diff (MiB) vs. orjson
orjson 194 99 1.0
ujson
rapidjson 3,048 309 15.7
simplejson 3,023 297 15.6
json 3,133 297 16.1

This measures serializing 100MiB of JSON from an numpy.ndarray with dimensions of (100000, 100) and numpy.int32 values:

Library Latency (ms) RSS diff (MiB) vs. orjson
orjson 178 115 1.0
ujson
rapidjson 1,512 551 8.5
simplejson 1,606 504 9.0
json 1,506 503 8.4

This measures serializing 105MiB of JSON from an numpy.ndarray with dimensions of (100000, 200) and numpy.bool values:

Library Latency (ms) RSS diff (MiB) vs. orjson
orjson 157 120 1.0
ujson
rapidjson 710 327 4.5
simplejson 931 398 5.9
json 996 400 6.3

In these benchmarks, orjson serializes natively, ujson is blank because it does not support a default parameter, and the other libraries serialize ndarray.tolist() via default. The RSS column measures peak memory usage during serialization. This can be reproduced using the pynumpy script.

orjson does not have an installation or compilation dependency on numpy. The implementation is independent, reading numpy.ndarray using PyArrayInterface.

str

orjson is strict about UTF-8 conformance. This is stricter than the standard library's json module, which will serialize and deserialize UTF-16 surrogates, e.g., "\ud800", that are invalid UTF-8.

If orjson.dumps() is given a str that does not contain valid UTF-8, orjson.JSONEncodeError is raised. If loads() receives invalid UTF-8, orjson.JSONDecodeError is raised.

orjson and rapidjson are the only compared JSON libraries to consistently error on bad input.

>>> import orjson, ujson, rapidjson, json
>>> orjson.dumps('\ud800')
JSONEncodeError: str is not valid UTF-8: surrogates not allowed
>>> ujson.dumps('\ud800')
UnicodeEncodeError: 'utf-8' codec ...
>>> rapidjson.dumps('\ud800')
UnicodeEncodeError: 'utf-8' codec ...
>>> json.dumps('\ud800')
'"\\ud800"'
>>> orjson.loads('"\\ud800"')
JSONDecodeError: unexpected end of hex escape at line 1 column 8: line 1 column 1 (char 0)
>>> ujson.loads('"\\ud800"')
''
>>> rapidjson.loads('"\\ud800"')
ValueError: Parse error at offset 1: The surrogate pair in string is invalid.
>>> json.loads('"\\ud800"')
'\ud800'

To make a best effort at deserializing bad input, first decode bytes using the replace or lossy argument for errors:

>>> import orjson
>>> orjson.loads(b'"\xed\xa0\x80"')
JSONDecodeError: str is not valid UTF-8: surrogates not allowed
>>> orjson.loads(b'"\xed\xa0\x80"'.decode("utf-8", "replace"))
'���'

uuid

orjson serializes uuid.UUID instances to RFC 4122 format, e.g., "f81d4fae-7dec-11d0-a765-00a0c91e6bf6".

>>> import orjson, uuid
>>> orjson.dumps(uuid.UUID('f81d4fae-7dec-11d0-a765-00a0c91e6bf6'))
b'"f81d4fae-7dec-11d0-a765-00a0c91e6bf6"'
>>> orjson.dumps(uuid.uuid5(uuid.NAMESPACE_DNS, "python.org"))
b'"886313e1-3b8a-5372-9b90-0c9aee199e5d"'

Testing

The library has comprehensive tests. There are tests against fixtures in the JSONTestSuite and nativejson-benchmark repositories. It is tested to not crash against the Big List of Naughty Strings. It is tested to not leak memory. It is tested to not crash against and not accept invalid UTF-8. There are integration tests exercising the library's use in web servers (gunicorn using multiprocess/forked workers) and when multithreaded. It also uses some tests from the ultrajson library.

orjson is the most correct of the compared libraries. This graph shows how each library handles a combined 342 JSON fixtures from the JSONTestSuite and nativejson-benchmark tests:

Library Invalid JSON documents not rejected Valid JSON documents not deserialized
orjson 0 0
ujson 38 0
rapidjson 6 0
simplejson 13 0
json 17 0

This shows that all libraries deserialize valid JSON but only orjson correctly rejects the given invalid JSON fixtures. Errors are largely due to accepting invalid strings and numbers.

The graph above can be reproduced using the pycorrectness script.

Performance

Serialization and deserialization performance of orjson is better than ultrajson, rapidjson, simplejson, or json. The benchmarks are done on fixtures of real data:

  • twitter.json, 631.5KiB, results of a search on Twitter for "一", containing CJK strings, dictionaries of strings and arrays of dictionaries, indented.

  • github.json, 55.8KiB, a GitHub activity feed, containing dictionaries of strings and arrays of dictionaries, not indented.

  • citm_catalog.json, 1.7MiB, concert data, containing nested dictionaries of strings and arrays of integers, indented.

  • canada.json, 2.2MiB, coordinates of the Canadian border in GeoJSON format, containing floats and arrays, indented.

Latency

twitter.json serialization

Library Median latency (milliseconds) Operations per second Relative (latency)
orjson 0.33 3069.4 1
ujson 1.68 592.8 5.15
rapidjson 1.12 891 3.45
simplejson 2.29 436.2 7.03
json 1.8 556.6 5.52

twitter.json deserialization

Library Median latency (milliseconds) Operations per second Relative (latency)
orjson 0.81 1237.6 1
ujson 1.87 533.9 2.32
rapidjson 2.97 335.8 3.67
simplejson 2.15 463.8 2.66
json 2.45 408.2 3.03

github.json serialization

Library Median latency (milliseconds) Operations per second Relative (latency)
orjson 0.03 28817.3 1
ujson 0.18 5478.2 5.26
rapidjson 0.1 9686.4 2.98
simplejson 0.26 3901.3 7.39
json 0.18 5437 5.27

github.json deserialization

Library Median latency (milliseconds) Operations per second Relative (latency)
orjson 0.07 15270 1
ujson 0.19 5374.8 2.84
rapidjson 0.17 5854.9 2.59
simplejson 0.15 6707.4 2.27
json 0.16 6397.3 2.39

citm_catalog.json serialization

Library Median latency (milliseconds) Operations per second Relative (latency)
orjson 0.58 1722.5 1
ujson 2.89 345.6 4.99
rapidjson 1.83 546.4 3.15
simplejson 10.39 95.9 17.89
json 3.93 254.6 6.77

citm_catalog.json deserialization

Library Median latency (milliseconds) Operations per second Relative (latency)
orjson 1.76 569.2 1
ujson 3.5 284.3 1.99
rapidjson 5.77 173.2 3.28
simplejson 5.13 194.7 2.92
json 4.99 200.5 2.84

canada.json serialization

Library Median latency (milliseconds) Operations per second Relative (latency)
orjson 3.62 276.3 1
ujson 14.16 70.6 3.91
rapidjson 33.64 29.7 9.29
simplejson 57.46 17.4 15.88
json 35.7 28 9.86

canada.json deserialization

Library Median latency (milliseconds) Operations per second Relative (latency)
orjson 3.89 256.6 1
ujson 8.73 114.3 2.24
rapidjson 23.33 42.8 5.99
simplejson 23.99 41.7 6.16
json 21.1 47.4 5.42

Memory

orjson as of 3.7.0 has higher baseline memory usage than other libraries due to a persistent buffer used for parsing. Incremental memory usage when deserializing is similar to the standard library and other third-party libraries.

This measures, in the first column, RSS after importing a library and reading the fixture, and in the second column, increases in RSS after repeatedly calling loads() on the fixture.

twitter.json

Library import, read() RSS (MiB) loads() increase in RSS (MiB)
orjson 21.8 2.8
ujson 14.3 4.8
rapidjson 14.9 4.6
simplejson 13.4 2.4
json 13.1 2.3

github.json

Library import, read() RSS (MiB) loads() increase in RSS (MiB)
orjson 21.2 0.5
ujson 13.6 0.6
rapidjson 14.1 0.5
simplejson 12.5 0.3
json 12.4 0.3

citm_catalog.json

Library import, read() RSS (MiB) loads() increase in RSS (MiB)
orjson 23 10.6
ujson 15.2 11.2
rapidjson 15.8 29.7
simplejson 14.4 24.7
json 13.9 24.7

canada.json

Library import, read() RSS (MiB) loads() increase in RSS (MiB)
orjson 23.2 21.3
ujson 15.6 19.2
rapidjson 16.3 23.4
simplejson 15 21.1
json 14.3 20.9

Reproducing

The above was measured using Python 3.10.5 on Linux (amd64) with orjson 3.7.9, ujson 5.4.0, python-rapidson 1.8, and simplejson 3.17.6.

The latency results can be reproduced using the pybench and graph scripts. The memory results can be reproduced using the pymem script.

Questions

Why can't I install it from PyPI?

Probably pip needs to be upgraded to version 20.3 or later to support the latest manylinux_x_y or universal2 wheel formats.

"Cargo, the Rust package manager, is not installed or is not on PATH."

This happens when there are no binary wheels (like manylinux) for your platform on PyPI. You can install Rust through rustup or a package manager and then it will compile.

Will it deserialize to dataclasses, UUIDs, decimals, etc or support object_hook?

No. This requires a schema specifying what types are expected and how to handle errors etc. This is addressed by data validation libraries a level above this.

Will it serialize to str?

No. bytes is the correct type for a serialized blob.

Will it support PyPy?

Probably not.

Packaging

To package orjson requires at least Rust 1.60 and the maturin build tool. The recommended build command is:

maturin build --release --strip

It benefits from also having a C build environment to compile a faster deserialization backend. See this project's manylinux_2_28 builds for an example using clang and LTO.

The project's own CI tests against nightly-2023-01-03 and stable 1.60. It is prudent to pin the nightly version because that channel can introduce breaking changes.

orjson is tested for amd64, aarch64, and arm7 on Linux. It is tested for amd64 on macOS and cross-compiles for aarch64. For Windows it is tested on amd64.

There are no runtime dependencies other than libc.

orjson's tests are included in the source distribution on PyPI. The requirements to run the tests are specified in test/requirements.txt. The tests should be run as part of the build. It can be run with pytest -q test.

License

orjson was written by ijl <ijl@mailbox.org>, copyright 2018 - 2023, licensed under both the Apache 2 and MIT licenses.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

orjson-3.8.5.tar.gz (651.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

orjson-3.8.5-cp311-none-win_amd64.whl (202.7 kB view details)

Uploaded CPython 3.11Windows x86-64

orjson-3.8.5-cp311-cp311-manylinux_2_28_x86_64.whl (140.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

orjson-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (270.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

orjson-3.8.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (149.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARMv7l

orjson-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (256.4 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64

orjson-3.8.5-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (489.2 kB view details)

Uploaded CPython 3.11macOS 10.9+ universal2 (ARM64, x86-64)macOS 10.9+ x86-64macOS 11.0+ ARM64

orjson-3.8.5-cp311-cp311-macosx_10_7_x86_64.whl (141.4 kB view details)

Uploaded CPython 3.11macOS 10.7+ x86-64

orjson-3.8.5-cp310-none-win_amd64.whl (202.7 kB view details)

Uploaded CPython 3.10Windows x86-64

orjson-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl (310.6 kB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ x86-64

orjson-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl (318.4 kB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ ARM64

orjson-3.8.5-cp310-cp310-manylinux_2_28_x86_64.whl (140.7 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

orjson-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (270.7 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

orjson-3.8.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (149.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARMv7l

orjson-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (256.4 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

orjson-3.8.5-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (489.2 kB view details)

Uploaded CPython 3.10macOS 10.9+ universal2 (ARM64, x86-64)macOS 10.9+ x86-64macOS 11.0+ ARM64

orjson-3.8.5-cp310-cp310-macosx_10_7_x86_64.whl (141.4 kB view details)

Uploaded CPython 3.10macOS 10.7+ x86-64

orjson-3.8.5-cp39-none-win_amd64.whl (202.7 kB view details)

Uploaded CPython 3.9Windows x86-64

orjson-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl (310.6 kB view details)

Uploaded CPython 3.9musllinux: musl 1.1+ x86-64

orjson-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl (318.4 kB view details)

Uploaded CPython 3.9musllinux: musl 1.1+ ARM64

orjson-3.8.5-cp39-cp39-manylinux_2_28_x86_64.whl (140.7 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ x86-64

orjson-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (270.7 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

orjson-3.8.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (149.4 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARMv7l

orjson-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (256.4 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

orjson-3.8.5-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (489.2 kB view details)

Uploaded CPython 3.9macOS 10.9+ universal2 (ARM64, x86-64)macOS 10.9+ x86-64macOS 11.0+ ARM64

orjson-3.8.5-cp39-cp39-macosx_10_7_x86_64.whl (141.4 kB view details)

Uploaded CPython 3.9macOS 10.7+ x86-64

orjson-3.8.5-cp38-none-win_amd64.whl (202.6 kB view details)

Uploaded CPython 3.8Windows x86-64

orjson-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl (310.5 kB view details)

Uploaded CPython 3.8musllinux: musl 1.1+ x86-64

orjson-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl (318.2 kB view details)

Uploaded CPython 3.8musllinux: musl 1.1+ ARM64

orjson-3.8.5-cp38-cp38-manylinux_2_28_x86_64.whl (140.6 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.28+ x86-64

orjson-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (270.5 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

orjson-3.8.5-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (149.5 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARMv7l

orjson-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (256.2 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

orjson-3.8.5-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (488.9 kB view details)

Uploaded CPython 3.8macOS 10.9+ universal2 (ARM64, x86-64)macOS 10.9+ x86-64macOS 11.0+ ARM64

orjson-3.8.5-cp38-cp38-macosx_10_7_x86_64.whl (141.3 kB view details)

Uploaded CPython 3.8macOS 10.7+ x86-64

orjson-3.8.5-cp37-none-win_amd64.whl (202.6 kB view details)

Uploaded CPython 3.7Windows x86-64

orjson-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl (310.5 kB view details)

Uploaded CPython 3.7mmusllinux: musl 1.1+ x86-64

orjson-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl (318.2 kB view details)

Uploaded CPython 3.7mmusllinux: musl 1.1+ ARM64

orjson-3.8.5-cp37-cp37m-manylinux_2_28_x86_64.whl (140.6 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.28+ x86-64

orjson-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (270.6 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

orjson-3.8.5-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (149.7 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ ARMv7l

orjson-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (256.1 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ ARM64

orjson-3.8.5-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (488.9 kB view details)

Uploaded CPython 3.7mmacOS 10.9+ universal2 (ARM64, x86-64)macOS 10.9+ x86-64macOS 11.0+ ARM64

orjson-3.8.5-cp37-cp37m-macosx_10_7_x86_64.whl (141.3 kB view details)

Uploaded CPython 3.7mmacOS 10.7+ x86-64

File details

Details for the file orjson-3.8.5.tar.gz.

File metadata

  • Download URL: orjson-3.8.5.tar.gz
  • Upload date:
  • Size: 651.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/0.14.9

File hashes

Hashes for orjson-3.8.5.tar.gz
Algorithm Hash digest
SHA256 77a3b2bd0c4ef7723ea09081e3329dac568a62463aed127c1501441b07ffc64b
MD5 95fe2a9fe295129dd427385e58b453d2
BLAKE2b-256 cb07e9a22e4d9304ca15455d2ae1696d1c74c3881b72450c8c1e07694029b6b9

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp311-none-win_amd64.whl.

File metadata

  • Download URL: orjson-3.8.5-cp311-none-win_amd64.whl
  • Upload date:
  • Size: 202.7 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/0.14.9

File hashes

Hashes for orjson-3.8.5-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 cc7579240fb88a626956a6cb4a181a11b62afbc409ce239a7b866568a2412fa2
MD5 536a867058074eddb876b4186203f32d
BLAKE2b-256 87ed84a8a4f1c2e4499b5fe5c7c727806492a5fbb5d1f77b058606820187dde0

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 758238364142fcbeca34c968beefc0875ffa10aa2f797c82f51cfb1d22d0934e
MD5 12ff6f7c08fe174e6b61f108db231c5f
BLAKE2b-256 2190919212967f8f2356742c536161b0d5c45fc7f04faf8061ede68804f53828

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c67f6f6e9d26a06b63126112a7bc8d8529df048d31df2a257a8484b76adf3e5d
MD5 a0fcc1eba6a0286071cd4fcac2630776
BLAKE2b-256 a417de8125a5019797f7d8a7288c9234d2be7a9ab7fb18e4935cbdbb77ca365f

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 9bae7347764e7be6dada980fd071e865544c98317ab61af575c9cc5e1dc7e3fe
MD5 d959453f7745a29ffdec68c3a0b9e0d8
BLAKE2b-256 383798e06908d95d4b2d0b679605630f271d272c690d8e925d381f40816bcf63

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c85c9c6bab97a831e7741089057347d99901b4db2451a076ca8adedc7d96297f
MD5 bc16fd575293440ed4711c340bef3aa7
BLAKE2b-256 c3cd516aa56074616dcd90d948c45c9358888876944864bbcb105b25f68a9bef

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 544f1240b295083697027a5093ec66763218ff16f03521d5020e7a436d2e417b
MD5 9d73298b614214bbd7697b8145aa7aa8
BLAKE2b-256 ed471c82e0db111fc770e93a4171ef3ada47b1f11c1979362b04703592db61f6

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp311-cp311-macosx_10_7_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp311-cp311-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 f5745ff473dd5c6718bf8c8d5bc183f638b4f3e03c7163ffcda4d4ef453f42ff
MD5 7f527e7a5d7cd10b95973b5f5a703ac0
BLAKE2b-256 648ba97499ccc9b70a57a69e323789533ac4155c19aaa7b62f064f4e846fe488

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp310-none-win_amd64.whl.

File metadata

  • Download URL: orjson-3.8.5-cp310-none-win_amd64.whl
  • Upload date:
  • Size: 202.7 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/0.14.9

File hashes

Hashes for orjson-3.8.5-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 2eee64c028adf6378dd714c8debc96d5b92b6bb4862debb65ca868e59bac6c63
MD5 56dbe0c4eb26fe1e77aac912c39b2028
BLAKE2b-256 32fbfdeba4cc8609bc189537d350321f9f5a2175d3e6a31105fbf6ec9865b508

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 6535d527aa1e4a757a6ce9b61f3dd74edc762e7d2c6991643aae7c560c8440bd
MD5 69de054acab534cc3e663bf58a17b92d
BLAKE2b-256 b6dbae024350e1fc4c78cb10a30cdeb9a6d3d8a1fb82670a50c46ce9a227bd4e

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 c0a9f329468c8eb000742455b83546849bcd69495d6baa6e171c7ee8600a47bd
MD5 ea7b38ff6ca718120f54a9e6e240c020
BLAKE2b-256 dabe2756f284baf94005ba82d6244d632747873c3e156289048aa999ee8eb1b0

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 4f1427952b3bd92bfb63a61b7ffc33a9f54ec6de296fa8d924cbeba089866acb
MD5 376ad0662ca44a6810f5767c9dfaed57
BLAKE2b-256 d9fdfa0f3e5c84b8fda2b8f93bac364d968e36cd83bf4c31b5e8f0f8ce943e2d

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 68cb4a8501a463771d55bb22fc72795ec7e21d71ab083e000a2c3b651b6fb2af
MD5 754ae77d88d51b69240a6fd778e42456
BLAKE2b-256 c0f17cf6de484ab687d7615a6a7c43347e0dfa4f9abc48f50b360334dd299d64

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 bf298b55b371c2772420c5ace4d47b0a3ea1253667e20ded3c363160fd0575f6
MD5 f78097f567a3b71574c6f387baa99321
BLAKE2b-256 4e3e50e5c09fe2357aa2f1aa4f59f9383ef8fd4a68722ddbe382c7b747f0d5e6

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c802ea6d4a0d40f096aceb5e7ef0a26c23d276cb9334e1cadcf256bb090b6426
MD5 73403ae99a675599a94b66f06c9f27de
BLAKE2b-256 3941d5cc7d897253f3beca2227511b5faecf7e89d5abe109e3f27afe13267c85

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 31f43e63e0d94784c55e86bd376df3f80b574bea8c0bc5ecd8041009fa8ec78a
MD5 378bd3cf0b20d62e0936740fbc922f01
BLAKE2b-256 daaa2a414d01a558fc836ca9fdd2671c4ea94a636bfa735c8cd67e12d8cc9965

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp310-cp310-macosx_10_7_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp310-cp310-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 143639b9898b094883481fac37733231da1c2ae3aec78a1dd8d3b58c9c9fceef
MD5 7e078a146b6dcfee61487dae02f2ce4c
BLAKE2b-256 3559686aafe5fa9303976f1a009b3b11cf09a1e20551ee113624c90d42c4c4fd

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp39-none-win_amd64.whl.

File metadata

  • Download URL: orjson-3.8.5-cp39-none-win_amd64.whl
  • Upload date:
  • Size: 202.7 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/0.14.9

File hashes

Hashes for orjson-3.8.5-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 0e9a1c2e649cbaed410c882cedc8f3b993d8f1426d9327f31762d3f46fe7cc88
MD5 f949e96e5e6fb4ca937aba87fdb303d4
BLAKE2b-256 d3610720e84d49b05241445070b5a29375c24779bfe34b727e10574b27cb44b5

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 38480031bc8add58effe802291e4abf7042ef72ae1a4302efe9a36c8f8bfbfcc
MD5 c831a64e43ee196fbb334bb819e7b181
BLAKE2b-256 7c0105e79103977238f90d0cc550ba77332a1d2c4c9d9df711027fa5e0641ff1

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 1848e3b4cc09cc82a67262ae56e2a772b0548bb5a6f9dcaee10dcaaf0a5177b7
MD5 0549234b88a02f9348deca6f0e09950e
BLAKE2b-256 f54cc978f0139a2acc6d6216e69358d15ebc3f251476ba52a7ca32c3c91190c6

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp39-cp39-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp39-cp39-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d48c182c7ff4ea0787806de8a2f9298ca44fd0068ecd5f23a4b2d8e03c745cb6
MD5 c6018c2ddc6c8523cdcedf45926e21dc
BLAKE2b-256 f7c8d8f1e5b9a9d4718a9182d526856cc98b5350db1a23bd25d52d69e6d40321

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6ccc9f52cf46bd353c6ae1153eaf9d18257ddc110d135198b0cd8718474685ce
MD5 de352b2046ca10c99975eba214b67f29
BLAKE2b-256 dab44f342b52f2192f6660612d10880b2960f98dd8160a2cec9b3b53f7c5fbbc

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 daaaef15a41e9e8cadc7677cefe00065ae10bce914eefe8da1cd26b3d063970b
MD5 7e66de6efa16453b285245e619b5bd4d
BLAKE2b-256 6bd86fbc3f9cc53aa525794da4cf84ef3e0c9b2bf08534534b6f546d38762ef2

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 eeab1d8247507a75926adf3ca995c74e91f5db1f168815bf3e774f992ba52b50
MD5 ef773ac30793b53ffaf62483735603f6
BLAKE2b-256 9e02f6956965b1238d66c42c838a41af5d495c540d8727691e34eff127ad6242

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 85e22c358cab170c8604e9edfffcc45dd7b0027ce57ed6bcacb556e8bfbbb704
MD5 907c62688fd993b72586ae81f357ffdd
BLAKE2b-256 aa2d24c3070d439825ca22a5ace04455b61ecec398fd6755a4d530942e504428

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp39-cp39-macosx_10_7_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp39-cp39-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 8fba3e7aede3e88a01e94e6fe63d4580162b212e6da27ae85af50a1787e41416
MD5 6273ee2146c04930aabadf497921d988
BLAKE2b-256 33ed80dd455893a58a0a10815dfa4b24aecd2115f9d18ea8b50ff7e4abc252ec

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp38-none-win_amd64.whl.

File metadata

  • Download URL: orjson-3.8.5-cp38-none-win_amd64.whl
  • Upload date:
  • Size: 202.6 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/0.14.9

File hashes

Hashes for orjson-3.8.5-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 232ec1df0d708f74e0dd1fccac1e9a7008cd120d48fe695e8f0c9d80771da430
MD5 26dfdcac9aa5458b034f822471bfa071
BLAKE2b-256 9abb9dbdd22764679c18b04f27dd5edf513dc93a9b72b4ba6709dfcaaacbdf1b

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 09f40add3c2d208e20f8bf185df38f992bf5092202d2d30eced8f6959963f1d5
MD5 7bf39729baa41ae3365ae94d7b991150
BLAKE2b-256 d7e59bf25d5987a6dd4416fbd118d89f5070b5b0dfa683d2f7d424cb2c383f6c

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 df3287dc304c8c4556dc85c4ab89eb333307759c1863f95e72e555c0cfce3e01
MD5 05137fc91a0983da83dc3fd0914fdf01
BLAKE2b-256 4fa4731e01ed7cfbb0b6e0bcf922c58587e0046edc0a0a6b3e5738bf85f33cb1

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp38-cp38-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp38-cp38-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ec0b0b6cd0b84f03537f22b719aca705b876c54ab5cf3471d551c9644127284f
MD5 55408bea9e0fa7a04f4f082fba79b337
BLAKE2b-256 0677c1fb9496ef3ff253edc9ce43ec80f6959278069006fb57e5c8066cf001b8

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 eee2f5f6476617d01ca166266d70fd5605d3397a41f067022ce04a2e1ced4c8d
MD5 4bbf02fac2efd66489ab9291865f1a38
BLAKE2b-256 91a3bcef40234db272a037e70bacd990f4dfb204af6c5376e9294ae5e99f8ced

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 a9bab11611d5452efe4ae5315f5eb806f66104c08a089fb84c648d2e8e00f106
MD5 30f191c4bde8fa6f892e8a17b7a070c0
BLAKE2b-256 aeee615c96b10ce6faf69750569dd6be92205d5a880e524a29fca5b64c02a25e

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 b573ca942c626fcf8a86be4f180b86b2498b18ae180f37b4180c2aced5808710
MD5 6baaf8572ecf9831355b1ea0d448e9b2
BLAKE2b-256 74ad1f46d1c3a55883dbd39484832d46ed3e9026d06fc703b5ad7394df26ce31

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 47a7ca236b25a138a74b2cb5169adcdc5b2b8abdf661de438ba65967a2cde9dc
MD5 dba33cd7e7a91c855be5e7d6fc4a9867
BLAKE2b-256 6cb4c35d69298532478113cc5c8436c1c5b512f594fbbf42bb716126428ea9a2

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp38-cp38-macosx_10_7_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp38-cp38-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 933f4ab98362f46a59a6d0535986e1f0cae2f6b42435e24a55922b4bc872af0c
MD5 942fc02ab101a6c9dcb6ded417b6449a
BLAKE2b-256 b2ead939884dddfe893fe2afabc63a684714d51b2e59fb1661e269c1e2584266

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp37-none-win_amd64.whl.

File metadata

  • Download URL: orjson-3.8.5-cp37-none-win_amd64.whl
  • Upload date:
  • Size: 202.6 kB
  • Tags: CPython 3.7, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/0.14.9

File hashes

Hashes for orjson-3.8.5-cp37-none-win_amd64.whl
Algorithm Hash digest
SHA256 6f58d1f0702332496bc1e2d267c7326c851991b62cf6395370d59c47f9890007
MD5 84cbcdb0029b03fcced446c6674f22a5
BLAKE2b-256 2fc93b5c81cf6e398ef9754d3def9f1e237e73a7dd9597c2545e56cef9b7df94

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 ece1b6ef9312df5d5274ca6786e613b7da7de816356e36bcad9ea8a73d15ab71
MD5 3266864c8f8c9563de523c49dd252147
BLAKE2b-256 d5d6bce036f533ef3bb26b5e9173ac6e76e15752efc874d630a0d3aea4472317

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 155954d725627b5480e6cc1ca488afb4fa685099a4ace5f5bf21a182fabf6706
MD5 e05382bd93403f921df63de1750f2039
BLAKE2b-256 784dc6357d020192f8b881998cf7ad0ccc2098e38225a20ca4306c6cce015c35

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp37-cp37m-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp37-cp37m-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 0e28330cc6d51741cad0edd1b57caf6c5531aff30afe41402acde0a03246b8ed
MD5 86b8b79142f66a5cd908f1675f1ab0da
BLAKE2b-256 ec9a3db9f032f94dc02533af342a392bfc467530f6611aaf913fc035254dd120

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 93ae9832a11c6a9efa8c14224e5caf6e35046efd781de14e59eb69ab4e561cf3
MD5 0174ea6eb0f8fe433dc0ddf2cdb8c061
BLAKE2b-256 d69355823cae2c8a18c6fc7fc217f4b9caf4dbfb9d313ca076cf76f60844841f

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 0b57bf72902d818506906e49c677a791f90dbd7f0997d60b14bc6c1ce4ce4cf9
MD5 01978361f9d1b75848064bc3718fd7f1
BLAKE2b-256 6465789ad6f3722e8b2357a3c51d9a59cb96e866563a32d4a628cc18edfb05d0

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f2be0025ca7e460bcacb250aba8ce0239be62957d58cf34045834cc9302611d3
MD5 dd57c440fac60bbf3f3761dc1edb59ee
BLAKE2b-256 deca903036b172efafd548837f9f1e0f44907e05974c0c7ae3b66a900d7b9862

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 2544cd0d089faa862f5a39f508ee667419e3f9e11f119a6b1505cfce0eb26601
MD5 2b7fca93e5a114b6d13c7163979574a3
BLAKE2b-256 ee99113131e7766bdd5cae8a52b4bbdf590fb243b91c67d1fdbccd295ff01aeb

See more details on using hashes here.

File details

Details for the file orjson-3.8.5-cp37-cp37m-macosx_10_7_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.8.5-cp37-cp37m-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 79aa3e47cbbd4eedbbde4f988f766d6cf38ccb51d52cfabfeb6b8d1b58654d25
MD5 25cc837236770f04505e429965549c93
BLAKE2b-256 16dfe7521bb333b8c6c575b2246672dd86789fac81e3f75849702c43cc25d40a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page