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-02-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

This version

3.8.6

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.6.tar.gz (655.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.6-cp311-none-win_amd64.whl (195.6 kB view details)

Uploaded CPython 3.11Windows x86-64

orjson-3.8.6-cp311-cp311-manylinux_2_28_x86_64.whl (140.9 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

orjson-3.8.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (271.4 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

orjson-3.8.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (149.8 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARMv7l

orjson-3.8.6-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.6-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (489.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.6-cp311-cp311-macosx_10_7_x86_64.whl (141.6 kB view details)

Uploaded CPython 3.11macOS 10.7+ x86-64

orjson-3.8.6-cp310-none-win_amd64.whl (195.6 kB view details)

Uploaded CPython 3.10Windows x86-64

orjson-3.8.6-cp310-cp310-musllinux_1_1_x86_64.whl (310.7 kB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ x86-64

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

Uploaded CPython 3.10musllinux: musl 1.1+ ARM64

orjson-3.8.6-cp310-cp310-manylinux_2_28_x86_64.whl (140.9 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

orjson-3.8.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (271.4 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

orjson-3.8.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (149.8 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARMv7l

orjson-3.8.6-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.6-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (489.3 kB view details)

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

orjson-3.8.6-cp310-cp310-macosx_10_7_x86_64.whl (141.6 kB view details)

Uploaded CPython 3.10macOS 10.7+ x86-64

orjson-3.8.6-cp39-none-win_amd64.whl (195.6 kB view details)

Uploaded CPython 3.9Windows x86-64

orjson-3.8.6-cp39-cp39-musllinux_1_1_x86_64.whl (310.7 kB view details)

Uploaded CPython 3.9musllinux: musl 1.1+ x86-64

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

Uploaded CPython 3.9musllinux: musl 1.1+ ARM64

orjson-3.8.6-cp39-cp39-manylinux_2_28_x86_64.whl (140.9 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ x86-64

orjson-3.8.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (271.4 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

orjson-3.8.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (149.8 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARMv7l

orjson-3.8.6-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.6-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (489.3 kB view details)

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

orjson-3.8.6-cp39-cp39-macosx_10_7_x86_64.whl (141.6 kB view details)

Uploaded CPython 3.9macOS 10.7+ x86-64

orjson-3.8.6-cp38-none-win_amd64.whl (195.5 kB view details)

Uploaded CPython 3.8Windows x86-64

orjson-3.8.6-cp38-cp38-musllinux_1_1_x86_64.whl (310.6 kB view details)

Uploaded CPython 3.8musllinux: musl 1.1+ x86-64

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

Uploaded CPython 3.8musllinux: musl 1.1+ ARM64

orjson-3.8.6-cp38-cp38-manylinux_2_28_x86_64.whl (140.7 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.28+ x86-64

orjson-3.8.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (271.2 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

orjson-3.8.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (149.9 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARMv7l

orjson-3.8.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (256.1 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARM64

orjson-3.8.6-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (489.0 kB view details)

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

orjson-3.8.6-cp38-cp38-macosx_10_7_x86_64.whl (141.5 kB view details)

Uploaded CPython 3.8macOS 10.7+ x86-64

orjson-3.8.6-cp37-none-win_amd64.whl (195.5 kB view details)

Uploaded CPython 3.7Windows x86-64

orjson-3.8.6-cp37-cp37m-musllinux_1_1_x86_64.whl (310.6 kB view details)

Uploaded CPython 3.7mmusllinux: musl 1.1+ x86-64

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

Uploaded CPython 3.7mmusllinux: musl 1.1+ ARM64

orjson-3.8.6-cp37-cp37m-manylinux_2_28_x86_64.whl (140.8 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.28+ x86-64

orjson-3.8.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (271.3 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

orjson-3.8.6-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (150.1 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ ARMv7l

orjson-3.8.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (256.0 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ ARM64

orjson-3.8.6-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (489.1 kB view details)

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

orjson-3.8.6-cp37-cp37m-macosx_10_7_x86_64.whl (141.5 kB view details)

Uploaded CPython 3.7mmacOS 10.7+ x86-64

File details

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

File metadata

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

File hashes

Hashes for orjson-3.8.6.tar.gz
Algorithm Hash digest
SHA256 91ef8a554d33fbc5bb61c3972f3e8baa994f72c4967671e64e7dac1cc06f50e1
MD5 22762b2f78589efeda70c30f851eba75
BLAKE2b-256 38331d4c62ccbe395c0d28c66535f31b1b1e8e38e7e7cff85abf32ee426a91d8

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for orjson-3.8.6-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 4a6c0a0ef2f535ba7a5d01f014b53d05eeb372d43556edb25c75a4d52690a123
MD5 5186cf7d4b73ba5c5e97717c2794f3f7
BLAKE2b-256 1e1f04a509f163d97bd3dce2b6a3d71fdd3f35e542599b42d40a8f1e4b9ab4fd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 583338b7dabb509ca4c3b4f160f58a5228bf6c6e0f8a2981663f683791f39d45
MD5 3f544b6b8a3b852d81fdc396e9506e3b
BLAKE2b-256 7c0035cc222abef5b6990f37d81dba4c72915d6215c6bf54c33975f74f115dfb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1d7402121d06d11fafcaed7d06f9d68b11bbe39868e0e1bc19239ee5b6b98b2b
MD5 6e9d67a5e8265f3ff8543cfc979d445f
BLAKE2b-256 ff3139b34f2c6742b7b3b9dfeaeb548e4c8db9402e38e9dcb822321b25dfad47

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 52809a37a0daa6992835ee0625aca22b4c0693dba3cb465948e6c9796de927b0
MD5 3c7118c5b2198eee3dff8060e0e7f7c5
BLAKE2b-256 41a5e591935cf8953fa5120bdf99b53e771c26adc5b0f25112d85cadba285932

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 865ef341c4d310ac2689bf811dbc0930b2f13272f8eade1511dc40b186f6d562
MD5 6d40a1bccefb1aac81df99df3f4e1837
BLAKE2b-256 f03cb357d9f01f73bd6e06755ffbc15c2239f3d96c19635577e2b14792841af1

See more details on using hashes here.

File details

Details for the file orjson-3.8.6-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.6-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 d44d89314a66e98e690ce64c8771d963eb64ae6cea662d0a1d077ed024627228
MD5 b6add9b2515527cb415aaabd870275c5
BLAKE2b-256 9247613ddd3cd9adbbc11678d82cce8654424de054154a0f2ef4a4b87480ddb6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp311-cp311-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 c59ec129d523abd4f2d65c0733d0e57af7dd09c69142f1aa564b04358f04ace3
MD5 1ddaa8131441f2ad040e835552f3c92f
BLAKE2b-256 6be0905a8dbc2ce472bf6d13691d7c72afcc4fbcbcce32819954dfd142dfe72f

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for orjson-3.8.6-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 3e44f78db3a15902b5e8386119979691ed3dd61d1ded10bad2c7106fd50641ef
MD5 a24f1bde35ddc4a96efae6da43fc3c5e
BLAKE2b-256 f63d5232ce089a0c0a12e6fcc5e5729cbcbd97f20d2a25f398889288e1bbbddc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 32353b14c5e0b55b6a8759e993482a2d8c44d492489840718b74658de67671e2
MD5 8b6ad4440ef264812666f885b9a7c9e7
BLAKE2b-256 78c7a825867eb53c0e5d0a2bebeea5c757b52f2136e601d116ff7aaa2ffe4638

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp310-cp310-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 4cb4f37fca8cf8309de421634447437f229bc03b240cec8ad4ac241fd4b1bcf4
MD5 56200e98b1376d98f842f1452761128b
BLAKE2b-256 634720a25670ba3b0299c2cbd907b0350f15a74509a7146f717a16e10822cf13

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 323065cf14fdd4096dbf93ea1634e7e030044af8c1000803bcdc132fbfd395f5
MD5 b948bccf054fe90d480e4ccc72352210
BLAKE2b-256 a4a2212b5c3dc4d0115e0f1cddad7ff480f710acc0223a70487ac739cdf44a5b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e57ecad7616ec842d8c382ed42a778cdcdadc67cfb46b804b43079f937b63b31
MD5 910887c66fbd3c0dd666628a4c95e7cc
BLAKE2b-256 2b5b030980bb51da70ed8f905a3f92ec77cea7a334c1bf18a7d2951eb4cfa9ba

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 34ce4a8b8f0fea483bce6985c015953f475540b7d756efd48a571b1803c318ee
MD5 61341ee1e62553e2112527931c252e3e
BLAKE2b-256 262e2d455282cad3369e34f1a80687d798d67be5d18990428becf6e253996306

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4a20905c7a5ebc280343704c4dd19343ef966c9dea5a38ade6e0461a6deb8eda
MD5 943061fe850859323175562dee10796f
BLAKE2b-256 1d6bb8ca413cab9481ca6b5d3dd5470153c00856585850ff9044c7588b8c3c94

See more details on using hashes here.

File details

Details for the file orjson-3.8.6-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.6-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 692c255109867cc8211267f4416d2915845273bf4f403bbca5419f5b15ac9175
MD5 1a3bb76121a4b997100d8f75d5bf7946
BLAKE2b-256 e6c79cf2b602cab2f1190c521e040015cd2d2cd4bd8b9745b1b0aa40329ad9cb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp310-cp310-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 062a9a74c10c439acc35cf67f31ac88d9464a11025700bab421e6cdf54a54a35
MD5 551813bf63524b91d053dd9b11013bfc
BLAKE2b-256 2eafca075d3893ad279e32d5bbf90262a50fbf4426f5d9b0df0bae8685f2f26c

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for orjson-3.8.6-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 aa7b112e3273d1744f7bc983ffd3dd0d004062c69dfa68e119515a7e115c46c8
MD5 dd11929584c66bbc6b77c113c77a330a
BLAKE2b-256 ab5788213ea93ee20d77042aea91aab17cc8f354b24b4d7d4bb9635b7b1b9624

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 d3f5ad9442e8a99fb436279a8614a00aca272ea8dabb692cadee70a4874d6e03
MD5 c7cf68eea77ddbe2e21e20dbb6f1350d
BLAKE2b-256 3c330fd38e19e5900834a13120bbc7585e62ee645729f75c131157cff4105ccd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp39-cp39-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 550a4dec128d1adfd0262ef9ad7878d62d1cc0bddaaa05e41d8ca28414dc86bc
MD5 2a2f49991e026992868f6da3d4899a15
BLAKE2b-256 37ee045c70c52a5e440adf1ba902efe50f3b9325d4ffa5a6448319c460f4c485

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp39-cp39-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2bdd64566870a8a0bdcf8c7df2f4452391dd55070f5cd98cc581914e8c263d85
MD5 86978c1e0671bacc297826d2836209a6
BLAKE2b-256 40517230ac149ad92f31ed5b05e250ae9e37478ada00946e5c9946b611af1923

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 caa5053f19584816f063c887d94385db481fc01d995d6a717ce4fbb929653ec2
MD5 12fad694abbe92ff8c1f9f0ae3c79a5b
BLAKE2b-256 077cfc0f255a3ef4da3eaa7c5ae69cfbedfa5dd60f52b05a1de335b9cd74d93d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 67554103b415349b6ee2db82d2422da1c8f4c2d280d20772217f6d1d227410b6
MD5 98c656fa0a020628dd37c64390c2e34d
BLAKE2b-256 2f64cf36a777bc422dd7d18fe7d601955e94c502dfa891ab8948070e184fdc7b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 006c492577ad046cb7e50237a8d8935131a35f7e7f8320fbc3514da6fbc0b436
MD5 28b80a9e0af37a0f2127a81efc886488
BLAKE2b-256 4d93a661c6a7e0028ed58669c8c5f8bc7c5f55f36ad5677c95212f9f7d550b60

See more details on using hashes here.

File details

Details for the file orjson-3.8.6-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.6-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 004122c95e08db7201b80224de3a8f2ad79b9717040e6884c6015f27b010127d
MD5 69f9933e70520f29a3b046aa1c434c1f
BLAKE2b-256 8dfb079b0055bdc900abb1d834989ed3542735709aab26c7af711c7e14255a38

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp39-cp39-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 7d216a5f3d23eac2c7c654e7bd30280c27cdf5edc32325e6ad8e880d36c265b7
MD5 8e2a8d4b47986f182719553e1dda3d48
BLAKE2b-256 5b7545a921d7e7b5b72515a388c6a58fb5f663ae6f601cfa91dfea11731e8b4d

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for orjson-3.8.6-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 aef3d558f5bd809733ebf2cbce7e1338ce62812db317478427236b97036aba0f
MD5 6226f675757860786d6edbb8ebbd96e0
BLAKE2b-256 85e31d3303e4e517957e8ac07268017eaefd352640cc9b9a4b96badc3d36c768

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 9d5ad2fddccc89ab64b6333823b250ce8430fc51f014954e5a2d4c933f5deb9f
MD5 5e28dc868251a6b66ef6284ce079b241
BLAKE2b-256 c2502d48eb952ee914d0300ac87deee118f949e5361937aa1b88406e68523510

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp38-cp38-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 006178fd654a0a4f14f5912b8320ba9a26ab9c0ae7ce1c7eeb4b5249d6cada29
MD5 a94b668562c2b231bbdabdb943b270b3
BLAKE2b-256 dcd82773f44d2af0d4cd8a2ca07413cb15ee9f0fdd65b256f37ae77312288faf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp38-cp38-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 cd2bd48e9a14f2130790a3c2dcb897bd93c2e5c244919799430a6d9b8212cb50
MD5 d2379bc964967264dfc08a73c176249b
BLAKE2b-256 c35dcf80bd4c80c43ad5a2dce45ddf20bf95bf6280d8b615d55aa769e9c75460

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 aae1487fba9d955b2679f0a697665ed8fc32563b3252acc240e097184c184e29
MD5 b67e2849d61f203a2bd6dd47e7ddf50c
BLAKE2b-256 9ca141c31fe1e8bc74fbb458b177fae87abf0d0c472490de6e3319048fd975dd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 c192813f527f886bd85abc5a9e8d9dde16ffa06d7305de526a7c4657730dbf4e
MD5 594bffca6e37b15ca04acf1506823e34
BLAKE2b-256 2a1b4a3d57eb8bf33c0c1b9901e6c23f6538c8a8b6adf0fbd0dd1ec7698a3bd3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 61fff8a8b4cd4e489b291fe5105b6138b1831490f1a0dc726d5e17ebe811d595
MD5 197c8aa30421b620221316f6b41bc5a9
BLAKE2b-256 28f902a96b58a6024a356b94785b842a13c3ff773619778f07c973b308cda900

See more details on using hashes here.

File details

Details for the file orjson-3.8.6-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.6-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 6190e23a2fb9fc78228b289b3ec295094671ca0299319c8c72727aa9e7dbe06f
MD5 0f5085aab40ae3a28a9e6c220a0a6734
BLAKE2b-256 d1597ac24db52ec7a5adf9ecb49183a1ec448da882ab11f85b6d791802f45cd8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp38-cp38-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 53f51c23398cfe818d9bb09079d31a60c6cd77e7eee1d555cfcc735460db4190
MD5 57164d9ca1b404d9e5775bf5a7f9f50f
BLAKE2b-256 23477329ab136916f8ecb2750b1a47ec637e6c3bebfde78ebf50b8a370990e57

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for orjson-3.8.6-cp37-none-win_amd64.whl
Algorithm Hash digest
SHA256 2c83a33cf389fd286bd9ef0befc406307444b9553d2e9ba14b90b9332524cfa6
MD5 d824f5a55d4d540e970213e301d074db
BLAKE2b-256 3ee67bba01cfb7985aba3b5a9ed5e41d49170722431489de4d6bc2787b5a532c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 5b3251ab7113f2400d76f2b4a2d6592e7d5a5cf45fa948c894340553671ef8f1
MD5 3c982f1e167baba1157040f53a951d74
BLAKE2b-256 c9aa621302f2c50f2a91cb88eda436b26a279d1d8177a688bbfec8d3cf3180b8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp37-cp37m-musllinux_1_1_aarch64.whl
Algorithm Hash digest
SHA256 38bc8a388080d8fd297388bcff4939e350ffafe4a006567e0dd81cdb8c7b86fa
MD5 7c36472974f5a1d7d0b424861edb9e18
BLAKE2b-256 47dfb68f140acbaa38eb8021fe938cbdc894d2d5ddc5e4be87373e2231ce462a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp37-cp37m-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 d3b0950d792b25c0aa52505faf09237fd98136d09616a0837f7cdb0fde9e2730
MD5 01b7ab4400da7fec21022be217a8deb1
BLAKE2b-256 2f39bd80d2f4a2849c7fc674254d6a4c76859693f5a666817296b97a1874e344

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8e048c6df7453c3da4de10fa5c44f6c655b157b712628888ce880cd5bbf30013
MD5 3f255c9222ceaec2d836ed108441f9d4
BLAKE2b-256 5dbf3100a4c820dc986bb300a30798bffee63e414bcaa56951dbfe49e88a02d3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 a38387387139695a7e52b9f568e39c1632b22eb34939afc5efed265fa8277b84
MD5 346f74dbf72b9d097a9773bca353b5c6
BLAKE2b-256 39a74faa06022a8d212ecaee511fce74c82492c5b6d424beadd1e6d979b5ec87

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 e8fc43bfb73d394b9bf12062cd6dab72abf728ac7869f972e4bb7327fd3330b8
MD5 6b9896730414878ba5b05425cf1ae77a
BLAKE2b-256 e302db61b0a220fb64e4252910cbfc2f01822940b7c0bfe1abb66b7874287f5d

See more details on using hashes here.

File details

Details for the file orjson-3.8.6-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.6-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 94d8fdc12adc0450994931d722cb38be5e4caa273219881abb96c15a9e9f151f
MD5 9f8e450546b5adee555ec3566571f9b6
BLAKE2b-256 a41ca5e6a414f75347de3c237b062aadfc535c4623a2e89828062fbf0d5815f7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.8.6-cp37-cp37m-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 9d35573e7f5817a26d8ce1134c3463d31bc3b39aad3ad7ae06bb67d6078fa9c0
MD5 5aa3362d7dfab821e1c262633988093c
BLAKE2b-256 924c6fbbc9b059c15dae2fd5d23bd3dc17aa62b834a426813109b9f797e4fdbb

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