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. 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 512 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.

It is faster to have orjson serialize datetime objects than to do so before calling dumps(). If using an unsupported type such as pendulum.datetime, use default.

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.

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 supported 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.57 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-2022-08-26 and stable 1.57. 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 - 2022, 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.0.tar.gz (949.1 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.0-cp311-none-win_amd64.whl (198.9 kB view details)

Uploaded CPython 3.11Windows x86-64

orjson-3.8.0-cp311-cp311-manylinux_2_28_x86_64.whl (146.0 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

orjson-3.8.0-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (490.3 kB view details)

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

orjson-3.8.0-cp311-cp311-macosx_10_7_x86_64.whl (145.8 kB view details)

Uploaded CPython 3.11macOS 10.7+ x86-64

orjson-3.8.0-cp310-none-win_amd64.whl (197.5 kB view details)

Uploaded CPython 3.10Windows x86-64

orjson-3.8.0-cp310-cp310-musllinux_1_1_x86_64.whl (458.8 kB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ x86-64

orjson-3.8.0-cp310-cp310-musllinux_1_1_aarch64.whl (443.1 kB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ ARM64

orjson-3.8.0-cp310-cp310-manylinux_2_28_x86_64.whl (146.0 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

orjson-3.8.0-cp310-cp310-manylinux_2_28_aarch64.whl (252.0 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

orjson-3.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (270.4 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

orjson-3.8.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (280.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARMv7l

orjson-3.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (262.4 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64

orjson-3.8.0-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (483.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.0-cp310-cp310-macosx_10_7_x86_64.whl (261.0 kB view details)

Uploaded CPython 3.10macOS 10.7+ x86-64

orjson-3.8.0-cp39-none-win_amd64.whl (197.5 kB view details)

Uploaded CPython 3.9Windows x86-64

orjson-3.8.0-cp39-cp39-musllinux_1_1_x86_64.whl (458.8 kB view details)

Uploaded CPython 3.9musllinux: musl 1.1+ x86-64

orjson-3.8.0-cp39-cp39-musllinux_1_1_aarch64.whl (443.1 kB view details)

Uploaded CPython 3.9musllinux: musl 1.1+ ARM64

orjson-3.8.0-cp39-cp39-manylinux_2_28_x86_64.whl (146.0 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ x86-64

orjson-3.8.0-cp39-cp39-manylinux_2_28_aarch64.whl (252.0 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ ARM64

orjson-3.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (270.4 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

orjson-3.8.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (280.5 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARMv7l

orjson-3.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (262.4 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64

orjson-3.8.0-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (483.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.0-cp39-cp39-macosx_10_7_x86_64.whl (261.0 kB view details)

Uploaded CPython 3.9macOS 10.7+ x86-64

orjson-3.8.0-cp38-none-win_amd64.whl (197.4 kB view details)

Uploaded CPython 3.8Windows x86-64

orjson-3.8.0-cp38-cp38-musllinux_1_1_x86_64.whl (458.6 kB view details)

Uploaded CPython 3.8musllinux: musl 1.1+ x86-64

orjson-3.8.0-cp38-cp38-musllinux_1_1_aarch64.whl (442.9 kB view details)

Uploaded CPython 3.8musllinux: musl 1.1+ ARM64

orjson-3.8.0-cp38-cp38-manylinux_2_28_x86_64.whl (145.9 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.28+ x86-64

orjson-3.8.0-cp38-cp38-manylinux_2_28_aarch64.whl (251.7 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.28+ ARM64

orjson-3.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (270.2 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

orjson-3.8.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (280.5 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARMv7l

orjson-3.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (262.1 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

orjson-3.8.0-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (482.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.0-cp38-cp38-macosx_10_7_x86_64.whl (260.8 kB view details)

Uploaded CPython 3.8macOS 10.7+ x86-64

orjson-3.8.0-cp37-none-win_amd64.whl (197.3 kB view details)

Uploaded CPython 3.7Windows x86-64

orjson-3.8.0-cp37-cp37m-musllinux_1_1_x86_64.whl (458.6 kB view details)

Uploaded CPython 3.7mmusllinux: musl 1.1+ x86-64

orjson-3.8.0-cp37-cp37m-musllinux_1_1_aarch64.whl (442.8 kB view details)

Uploaded CPython 3.7mmusllinux: musl 1.1+ ARM64

orjson-3.8.0-cp37-cp37m-manylinux_2_28_x86_64.whl (145.9 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.28+ x86-64

orjson-3.8.0-cp37-cp37m-manylinux_2_28_aarch64.whl (251.7 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.28+ ARM64

orjson-3.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (270.2 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

orjson-3.8.0-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (280.7 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ ARMv7l

orjson-3.8.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (262.1 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ ARM64

orjson-3.8.0-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (482.8 kB view details)

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

orjson-3.8.0-cp37-cp37m-macosx_10_7_x86_64.whl (260.7 kB view details)

Uploaded CPython 3.7mmacOS 10.7+ x86-64

File details

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

File metadata

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

File hashes

Hashes for orjson-3.8.0.tar.gz
Algorithm Hash digest
SHA256 fb42f7cf57d5804a9daa6b624e3490ec9e2631e042415f3aebe9f35a8492ba6c
MD5 d460b188ddaafa36a767abaed541cd10
BLAKE2b-256 0ade282b8ca582b63e39e9ef7069c47c7be617d201e47ae435da851f7ffe61d1

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for orjson-3.8.0-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 b21c7af0ff6228ca7105f54f0800636eb49201133e15ddb80ac20c1ce973ef07
MD5 9af7ad2b81eec79f0012788786c94a3c
BLAKE2b-256 7569d8fa6894780b68778ff00361710fc06521bb2d61229f0d5c217ad9c5d035

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e2defd9527651ad39ec20ae03c812adf47ef7662bdd6bc07dabb10888d70dc62
MD5 2520e6b70d119de4f8bb00909dbcd5b3
BLAKE2b-256 3cac0ab22b8e9b8d2894feb65bdd653193e70d9961a6971acbd233bb6a07500b

See more details on using hashes here.

File details

Details for the file orjson-3.8.0-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.0-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 9529990f3eab54b976d327360aa1ff244a4b12cb5e4c5b3712fcdd96e8fe56d4
MD5 e82fb702fc79673ae0e31d12f0bac2a0
BLAKE2b-256 44f4090e5687b5c8497282bc8d645c92d913644700ece62b4d1d4de467d284e4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp311-cp311-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 200eae21c33f1f8b02a11f5d88d76950cd6fd986d88f1afe497a8ae2627c49aa
MD5 6ec1abdf85c3875507e5cc678cd29a27
BLAKE2b-256 445f819ec73bf2362725e74ca2a5f1d310790a88426882dbe0d5bead83d4247e

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for orjson-3.8.0-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 2d81e6e56bbea44be0222fb53f7b255b4e7426290516771592738ca01dbd053b
MD5 9a8384ec3f007a3aa642fdeccc26eb17
BLAKE2b-256 202c824eec5ad627906cf50d1afaf82e1b81e30e5a7e1583568562fc698bc13a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 ff13410ddbdda5d4197a4a4c09969cb78c722a67550f0a63c02c07aadc624833
MD5 e6c298012afa1bc28903244f60c3c68f
BLAKE2b-256 9bfa1f029185cea4910d627309d9cd673f65ec78380f91044de685ec3185421b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp310-cp310-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 b68a42a31f8429728183c21fb440c21de1b62e5378d0d73f280e2d894ef8942e
MD5 6c5eef389d121783f8c4936a2b5739e5
BLAKE2b-256 471e4759a32fc5640de759861faf59f76e8707abfedff67a826133ca09e9acd9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6a23b40c98889e9abac084ce5a1fb251664b41da9f6bdb40a4729e2288ed2ed4
MD5 7bac8079aaad17872f956466dfdb9c31
BLAKE2b-256 eaa2e6c94631bd5117c9cf9453bc90cfe44db17cec13046c7f2df10020705d16

See more details on using hashes here.

File details

Details for the file orjson-3.8.0-cp310-cp310-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for orjson-3.8.0-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d189e2acb510e374700cb98cf11b54f0179916ee40f8453b836157ae293efa79
MD5 7cc7992818bd8b173b5800347fa0d9e6
BLAKE2b-256 ae7f0e03720e4320f08fc9ede5f90e81d8afa102c937ae00199f32119b9ce14f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2bdb1042970ca5f544a047d6c235a7eb4acdb69df75441dd1dfcbc406377ab37
MD5 c33a35283116041b83cdb428375e2088
BLAKE2b-256 5860a8f22a4081ede842347010cfbe13a4712a6ba0e3facde444c25014685b1e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 8b391d5c2ddc2f302d22909676b306cb6521022c3ee306c861a6935670291b2c
MD5 2c08711c07b203f26041dc508fd30484
BLAKE2b-256 65404b2486fbd5d39305f7974474565372f808bc03d25bc7f8aa28d119104318

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 66c19399bb3b058e3236af7910b57b19a4fc221459d722ed72a7dc90370ca090
MD5 9b8d54df55367bbfb5b1fe06bee2fa33
BLAKE2b-256 ebc762ed6579c4eb51a2bb1435d49848f2b99ca376dceff555031760ba0e35e3

See more details on using hashes here.

File details

Details for the file orjson-3.8.0-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.0-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 7536a2a0b41672f824912aeab545c2467a9ff5ca73a066ff04fb81043a0a177a
MD5 222445e2850cd1eceea4cad2dc2c2136
BLAKE2b-256 74715024229c3e6ca20ba069fd4428e322c3e038a881320491e7b9fe98a2df88

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp310-cp310-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 9a93850a1bdc300177b111b4b35b35299f046148ba23020f91d6efd7bf6b9d20
MD5 330003f9baa7267750f0e2ee38af6418
BLAKE2b-256 3cac0a8762a146c3fe4606e7462cd748787c3e246fe2dadd096b57ae16436046

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for orjson-3.8.0-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 2058653cc12b90e482beacb5c2d52dc3d7606f9e9f5a52c1c10ef49371e76f52
MD5 100cfa4ee33da49b335d21d81bf61ead
BLAKE2b-256 0f96e897a676d33bc4817c9417c4a9bbe3374a1cd14770ae4bdff43259bada02

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 25b5e48fbb9f0b428a5e44cf740675c9281dd67816149fc33659803399adbbe8
MD5 cdffc1f7367780bcfb3a2d0954ee5b5a
BLAKE2b-256 471ad81e343472be9c2d636705526129d5fe0b375c4033eb1d3e7e0b3c4934f4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp39-cp39-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 5fd6cac83136e06e538a4d17117eaeabec848c1e86f5742d4811656ad7ee475f
MD5 2151d7cd10a560796742f7ae27deff2b
BLAKE2b-256 856506fed4a8015efea525700d9ce75e427aa56101317b6d506aeb5084fd8cb5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp39-cp39-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2065b6d280dc58f131ffd93393737961ff68ae7eb6884b68879394074cc03c13
MD5 40955467e2d825879f5b7e491fef2270
BLAKE2b-256 6e19ab7034ccbcdc7bde2102df3396f6ddd75b38ecfdf053f776c98b668db941

See more details on using hashes here.

File details

Details for the file orjson-3.8.0-cp39-cp39-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for orjson-3.8.0-cp39-cp39-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a709c2249c1f2955dbf879506fd43fa08c31fdb79add9aeb891e3338b648bf60
MD5 98247378d113d468fc7bac71086720c0
BLAKE2b-256 47e144cb472f9e9b5d78b536a33fd3b217af8d8d8f4e2ce8a379932361f57265

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 be02f6acee33bb63862eeff80548cd6b8a62e2d60ad2d8dfd5a8824cc43d8887
MD5 cf368eb4e33991ac86d3bf0e2a62519a
BLAKE2b-256 d959409f62b363d14b1580e277c80247d93766ef0d03ddd8fd06f121de25ad95

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 87462791dd57de2e3e53068bf4b7169c125c50960f1bdda08ed30c797cb42a56
MD5 82c1f749796d9cf0f3f51cd3f46c13fe
BLAKE2b-256 09208470b09b2967ecdbcf0319e1e7103112290ef49575d3014f85650dbc73b4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 6433c956f4a18112342a18281e0bec67fcd8b90be3a5271556c09226e045d805
MD5 131376bc6f1776c2c6c9cf35d376960c
BLAKE2b-256 39ee191072c82df32c7b3a44938505ca372f362365c2907f4fa6e5da89ef030a

See more details on using hashes here.

File details

Details for the file orjson-3.8.0-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.0-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 6ea5fe20ef97545e14dd4d0263e4c5c3bc3d2248d39b4b0aed4b84d528dfc0af
MD5 47bea07b2b97f8e008f123d4e774b9d8
BLAKE2b-256 b3546c848b613089574b8a463e39643f2907764551b82281632ed08eadcbb191

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp39-cp39-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 7b0e72974a5d3b101226899f111368ec2c9824d3e9804af0e5b31567f53ad98a
MD5 dc806e2391af2810abde12b70700f44b
BLAKE2b-256 7bc569bbb4d2ccd8bf253720c9a03c33a909f5f5392cd835e9736215bd180bb1

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for orjson-3.8.0-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 03ed95814140ff09f550b3a42e6821f855d981c94d25b9cc83e8cca431525d70
MD5 ebcaf6bb66e79d745f8c68ada8f6a243
BLAKE2b-256 ab55e5418ee311dfc8e091b946f588ce90f6fa0037f125535d30a5488b7ec672

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 5edb93cdd3eb32977633fa7aaa6a34b8ab54d9c49cdcc6b0d42c247a29091b22
MD5 22f6186c36867bf71764582f719731ea
BLAKE2b-256 7bc013fdd5ec44d5360b0771c3580053b205f7202c3c2de3ba6586c671825203

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp38-cp38-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 655d7387a1634a9a477c545eea92a1ee902ab28626d701c6de4914e2ed0fecd2
MD5 c2af3265a45fe3676c983920f49a740d
BLAKE2b-256 df12790f69e6b01c1e38e698bf736c26260912cc18b10753c3cd6fa9d01b42fd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp38-cp38-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f4b46dbdda2f0bd6480c39db90b21340a19c3b0fcf34bc4c6e465332930ca539
MD5 87c87050ddb3149bc48fec6850d9e7ef
BLAKE2b-256 7311216b5b2c84b71577c25e6f86ca28e584526b9bbf59724d6256d8ee78fda0

See more details on using hashes here.

File details

Details for the file orjson-3.8.0-cp38-cp38-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for orjson-3.8.0-cp38-cp38-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 02d638d43951ba346a80f0abd5942a872cc87db443e073f6f6fc530fee81e19b
MD5 1592bd727dc3d00d38e9366bb741719a
BLAKE2b-256 1aae490223d0fb2ce0eaca773a94fd1d1f97efdb42d25b7a9004c135b58e8c22

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7990a9caf3b34016ac30be5e6cfc4e7efd76aa85614a1215b0eae4f0c7e3db59
MD5 a6bb6419b10029e4dcd5d4f96ce7d5f8
BLAKE2b-256 c0e3b0fa3e419925292b9de69b263c666f7d5419fcefbebd0e922a0fb00b5f93

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 8f687776a03c19f40b982fb5c414221b7f3d19097841571be2223d1569a59877
MD5 ded46a0d33076d651ae800bfd6df43d0
BLAKE2b-256 5f5b4049b47eacccb100afaad58aa737e0f73bbb97b1b59062a6ad58068dfa42

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 3c7225e8b08996d1a0c804d3a641a53e796685e8c9a9fd52bd428980032cad9a
MD5 c6d7d20dc01539a404d7e722f976591c
BLAKE2b-256 83c426ae60bd8d5ac07cdb2a09acc72e83d9c841ecfda92bdcd50ebff4101aa3

See more details on using hashes here.

File details

Details for the file orjson-3.8.0-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.0-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 e68c699471ea3e2dd1b35bfd71c6a0a0e4885b64abbe2d98fce1ef11e0afaff3
MD5 dbbb93385be6921667a900fe7057c6bc
BLAKE2b-256 75d9d95af6f001474401c0498c41c57a7e0865d488a5b0befbdd23e58773454a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp38-cp38-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 5b072ef8520cfe7bd4db4e3c9972d94336763c2253f7c4718a49e8733bada7b8
MD5 97322cd43a0c7d4f775ccc0bca99a027
BLAKE2b-256 706d3881a2a8acbd40880713c26db078e5c48f090ed86f1fc39cded6ac5cf4ad

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for orjson-3.8.0-cp37-none-win_amd64.whl
Algorithm Hash digest
SHA256 d2b5dafbe68237a792143137cba413447f60dd5df428e05d73dcba10c1ea6fcf
MD5 1adc8d37907d440a264110b514b29a04
BLAKE2b-256 5b044aea054c46ff0f800decd690c4044203af68166cd7304bc92b9c49e3cd8b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 3e2459d441ab8fd8b161aa305a73d5269b3cda13b5a2a39eba58b4dd3e394f49
MD5 28ecd6794beb004ea4786e1426beb770
BLAKE2b-256 273ae07cec53958bb756a78a984a7f25e75fa68c3a20df13fd5102d83a64e704

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp37-cp37m-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 1b1cd25acfa77935bb2e791b75211cec0cfc21227fe29387e553c545c3ff87e1
MD5 bb8f73641b7ec5a5580965faac076c7a
BLAKE2b-256 a17d7ec4195b5df624deba684490a61d7707496b8485fb8b0a9f0ef3e8d96c1a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp37-cp37m-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5f856279872a4449fc629924e6a083b9821e366cf98b14c63c308269336f7c14
MD5 32af4c65749ed5e168549a243bd437d7
BLAKE2b-256 ea8cb4f216d9a26d04fc7361640d414c81588569ab5904ac1186fa3ada8c6a40

See more details on using hashes here.

File details

Details for the file orjson-3.8.0-cp37-cp37m-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for orjson-3.8.0-cp37-cp37m-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4065906ce3ad6195ac4d1bddde862fe811a42d7be237a1ff762666c3a4bb2151
MD5 2b4ba4e1ea3e9fd867a6dec4b1d533c2
BLAKE2b-256 47c5bbb641641c2f04fb5ee67c98d7e86b354f4de1324630b987811ffdaafa9a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 896a21a07f1998648d9998e881ab2b6b80d5daac4c31188535e9d50460edfcf7
MD5 5bb5bcad81e78493618a2e2af078db96
BLAKE2b-256 3411144685f0ae4cd102f7d6780e2e1439c35b3bb8924339644de9a516a67756

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 6e3da2e4bd27c3b796519ca74132c7b9e5348fb6746315e0f6c1592bc5cf1caf
MD5 5e2c8c3d112ea46134f258184145ec4f
BLAKE2b-256 d6e57d5ea44962c36e0bbf88912e21752f222b9581db7357b59df2f8ee4cae11

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e1418feeb8b698b9224b1f024555895169d481604d5d884498c1838d7412794c
MD5 b303381810b67dde70a094a83c011647
BLAKE2b-256 258754eb4877f83b9fb3155994a388e7c86f7848f273acda396e95670eb17b2c

See more details on using hashes here.

File details

Details for the file orjson-3.8.0-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.0-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 e2f4a5542f50e3d336a18cb224fc757245ca66b1fd0b70b5dd4471b8ff5f2b0e
MD5 0ee65dc3c50d2d68dfd7f4315008c339
BLAKE2b-256 a268bbe345450617299377ff9dda298bd87935acf7a8af625a51e3361101863d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.0-cp37-cp37m-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 9e6ac22cec72d5b39035b566e4b86c74b84866f12b5b0b6541506a080fb67d6d
MD5 5a1bc42b79fc31957327797e0c9efe14
BLAKE2b-256 22293e7058b3a0044341517c116d7f6e96d9b436daab3e013b719502a95792f1

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