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, and 3.10. 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.06 0.07 1.0
ujson 0.18 0.19 2.8
rapidjson 0.22
simplejson 0.35 1.49 21.4
json 0.36 1.19 17.2

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.88 1.73 1.0
ujson 3.73 4.52 2.6
rapidjson 3.54
simplejson 11.77 72.06 41.6
json 6.71 55.22 31.9

rapidjson is blank because it does not support pretty printing. 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.5 0.92 1
ujson 1.61 2.48 2.7
rapidjson 2.17 2.89 3.2
simplejson 3.56 5.13 5.6
json 3.59 4.59 5

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, se 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. The same behavior is observed in rapidjson, simplejson, and json. ujson 1.35 was inaccurate in both serialization and deserialization, i.e., it modifies the data, and the recent 2.0 release is accurate.

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.int8, numpy.uint64, numpy.uint32, 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

alt text alt text alt text alt text alt text alt text alt text alt text

twitter.json serialization

Library Median latency (milliseconds) Operations per second Relative (latency)
orjson 0.59 1698.8 1
ujson 2.14 464.3 3.64
rapidjson 2.39 418.5 4.06
simplejson 3.15 316.9 5.36
json 3.56 281.2 6.06

twitter.json deserialization

Library Median latency (milliseconds) Operations per second Relative (latency)
orjson 2.28 439.3 1
ujson 2.89 345.9 1.27
rapidjson 3.85 259.6 1.69
simplejson 3.66 272.1 1.61
json 4.05 246.7 1.78

github.json serialization

Library Median latency (milliseconds) Operations per second Relative (latency)
orjson 0.07 15265.2 1
ujson 0.22 4556.7 3.35
rapidjson 0.26 3808.9 4.02
simplejson 0.37 2690.4 5.68
json 0.35 2847.8 5.36

github.json deserialization

Library Median latency (milliseconds) Operations per second Relative (latency)
orjson 0.18 5610.1 1
ujson 0.28 3540.7 1.58
rapidjson 0.33 3031.5 1.85
simplejson 0.29 3385.6 1.65
json 0.29 3402.1 1.65

citm_catalog.json serialization

Library Median latency (milliseconds) Operations per second Relative (latency)
orjson 0.99 1008.5 1
ujson 3.69 270.7 3.72
rapidjson 3.55 281.4 3.58
simplejson 11.76 85.1 11.85
json 6.89 145.1 6.95

citm_catalog.json deserialization

Library Median latency (milliseconds) Operations per second Relative (latency)
orjson 4.53 220.5 1
ujson 5.67 176.5 1.25
rapidjson 7.51 133.3 1.66
simplejson 7.54 132.7 1.66
json 7.8 128.2 1.72

canada.json serialization

Library Median latency (milliseconds) Operations per second Relative (latency)
orjson 4.72 198.9 1
ujson 17.76 56.3 3.77
rapidjson 61.83 16.2 13.11
simplejson 80.6 12.4 17.09
json 52.38 18.8 11.11

canada.json deserialization

Library Median latency (milliseconds) Operations per second Relative (latency)
orjson 10.28 97.4 1
ujson 16.49 60.5 1.6
rapidjson 37.92 26.4 3.69
simplejson 37.7 26.5 3.67
json 37.87 27.6 3.68

Memory

orjson's memory usage when deserializing is similar to or lower than 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 13.5 2.5
ujson 14 4.1
rapidjson 14.7 6.5
simplejson 13.2 2.5
json 12.9 2.3

github.json

Library import, read() RSS (MiB) loads() increase in RSS (MiB)
orjson 13.1 0.3
ujson 13.5 0.3
rapidjson 14 0.7
simplejson 12.6 0.3
json 12.3 0.1

citm_catalog.json

Library import, read() RSS (MiB) loads() increase in RSS (MiB)
orjson 14.6 7.9
ujson 15.1 11.1
rapidjson 15.8 36
simplejson 14.3 27.4
json 14 27.2

canada.json

Library import, read() RSS (MiB) loads() increase in RSS (MiB)
orjson 17.1 15.7
ujson 17.6 17.4
rapidjson 18.3 17.9
simplejson 16.9 19.6
json 16.5 19.4

Reproducing

The above was measured using Python 3.8.3 on Linux (x86_64) with orjson 3.3.0, ujson 3.0.0, python-rapidson 0.9.1, and simplejson 3.17.2.

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.

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?

If someone implements it well.

Packaging

To package orjson requires Rust and the maturin build tool.

This is an example for x86_64 on the Rust nightly channel:

maturin build --no-sdist --release --strip --cargo-extra-args="--features=unstable-simd"

To build on the stable channel, do not specify --features=unstable-simd.

The project's own CI tests against nightly-2022-04-14 and stable 1.54. 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 ships an aarch64 wheel also supporting aarch64. For Windows is 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.6.8.tar.gz (549.2 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.6.8-cp310-none-win_amd64.whl (184.6 kB view details)

Uploaded CPython 3.10Windows x86-64

orjson-3.6.8-cp310-cp310-musllinux_1_1_x86_64.whl (286.4 kB view details)

Uploaded CPython 3.10musllinux: musl 1.1+ x86-64

orjson-3.6.8-cp310-cp310-manylinux_2_24_x86_64.whl (253.5 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ x86-64

orjson-3.6.8-cp310-cp310-manylinux_2_24_aarch64.whl (236.6 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ ARM64

orjson-3.6.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (246.2 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARMv7l

orjson-3.6.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (445.5 kB view details)

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

orjson-3.6.8-cp310-cp310-macosx_10_7_x86_64.whl (239.9 kB view details)

Uploaded CPython 3.10macOS 10.7+ x86-64

orjson-3.6.8-cp39-none-win_amd64.whl (184.6 kB view details)

Uploaded CPython 3.9Windows x86-64

orjson-3.6.8-cp39-cp39-musllinux_1_1_x86_64.whl (286.4 kB view details)

Uploaded CPython 3.9musllinux: musl 1.1+ x86-64

orjson-3.6.8-cp39-cp39-manylinux_2_24_x86_64.whl (253.5 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.24+ x86-64

orjson-3.6.8-cp39-cp39-manylinux_2_24_aarch64.whl (236.6 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.24+ ARM64

orjson-3.6.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (253.7 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

orjson-3.6.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (246.2 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARMv7l

orjson-3.6.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (445.5 kB view details)

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

orjson-3.6.8-cp39-cp39-macosx_10_7_x86_64.whl (239.9 kB view details)

Uploaded CPython 3.9macOS 10.7+ x86-64

orjson-3.6.8-cp38-none-win_amd64.whl (184.4 kB view details)

Uploaded CPython 3.8Windows x86-64

orjson-3.6.8-cp38-cp38-musllinux_1_1_x86_64.whl (286.3 kB view details)

Uploaded CPython 3.8musllinux: musl 1.1+ x86-64

orjson-3.6.8-cp38-cp38-manylinux_2_24_x86_64.whl (253.4 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.24+ x86-64

orjson-3.6.8-cp38-cp38-manylinux_2_24_aarch64.whl (236.8 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.24+ ARM64

orjson-3.6.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (253.6 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

orjson-3.6.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (246.3 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ ARMv7l

orjson-3.6.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (445.4 kB view details)

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

orjson-3.6.8-cp38-cp38-macosx_10_7_x86_64.whl (239.8 kB view details)

Uploaded CPython 3.8macOS 10.7+ x86-64

orjson-3.6.8-cp37-none-win_amd64.whl (184.4 kB view details)

Uploaded CPython 3.7Windows x86-64

orjson-3.6.8-cp37-cp37m-musllinux_1_1_x86_64.whl (286.4 kB view details)

Uploaded CPython 3.7mmusllinux: musl 1.1+ x86-64

orjson-3.6.8-cp37-cp37m-manylinux_2_24_x86_64.whl (253.5 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.24+ x86-64

orjson-3.6.8-cp37-cp37m-manylinux_2_24_aarch64.whl (236.5 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.24+ ARM64

orjson-3.6.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (253.7 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ x86-64

orjson-3.6.8-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (246.4 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.17+ ARMv7l

orjson-3.6.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl (445.3 kB view details)

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

orjson-3.6.8-cp37-cp37m-macosx_10_7_x86_64.whl (239.8 kB view details)

Uploaded CPython 3.7mmacOS 10.7+ x86-64

File details

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

File metadata

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

File hashes

Hashes for orjson-3.6.8.tar.gz
Algorithm Hash digest
SHA256 e19d23741c5de13689bb316abfccea15a19c264e3ec8eb332a5319a583595ace
MD5 7f226eaf2c206dd71e0bbd88f5fb2426
BLAKE2b-256 148e7e745d867466bdafb12ab7b0179d40f23f55639f7cd14bd375acfa74aca2

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for orjson-3.6.8-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 eb22485847b9a0c4bbedc668df860126ac931edbed1d456cf41a59f3cb961ed8
MD5 59e3790088b3fcf2e7cd2b552fac3ced
BLAKE2b-256 1c89b8fcd1959c671696468fdb7a3ec086376953d849d99e0c83069040ff4b7d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.6.8-cp310-cp310-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 0db5c5a0c5b89f092d52f6e5a3701660a9d6ffa9e2968b3ce17c2bc4f5eb0414
MD5 e4cc62cb7011f1aadb822cdf151464bb
BLAKE2b-256 dc138eabf4805c2f7f7ec004d2103673e5d1ce47afe2af9fe18c09a9d6836736

See more details on using hashes here.

File details

Details for the file orjson-3.6.8-cp310-cp310-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.6.8-cp310-cp310-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 c31c9f389be7906f978ed4192eb58a4b74a37ad60556a0b88ddc47c576697770
MD5 8d56587277ccaa0e81d53e8e3c5f2438
BLAKE2b-256 7db97eb1dfd7dbefe50e5598418ca4452e8ae65f426faccf439fa09c67c7daef

See more details on using hashes here.

File details

Details for the file orjson-3.6.8-cp310-cp310-manylinux_2_24_aarch64.whl.

File metadata

File hashes

Hashes for orjson-3.6.8-cp310-cp310-manylinux_2_24_aarch64.whl
Algorithm Hash digest
SHA256 279f2d2af393fdf8601020744cb206b91b54ad60fb8401e0761819c7bda1f4e4
MD5 6ad601a204d2d0fc3c219e7868378efa
BLAKE2b-256 985c28f10f4f1a21e829dc03dcf6e29491bcf9acfd3ab4293811ebfa521a796a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.6.8-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 77e8386393add64f959c044e0fb682364fd0e611a6f477aa13f0e6a733bd6a28
MD5 65ae2c9be7b69800cb7fd732516dde10
BLAKE2b-256 26d5b17f9d646b8b5cffd3a3aee03eb6b244ffa6fec01fa077987364483683b5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.6.8-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 5204e25c12cea58e524fc82f7c27ed0586f592f777b33075a92ab7b3eb3687c2
MD5 757bc70bf79c2ffa7bed64cbf4916218
BLAKE2b-256 a045f38c2d0f379e0fdc556dbebbbe4cbcbf569f97a4370f81a047c3ed8c360b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.6.8-cp310-cp310-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 3a287a650458de2211db03681b71c3e5cb2212b62f17a39df8ad99fc54855d0f
MD5 b515c1891b098f95aed72e1723845497
BLAKE2b-256 9d5799a0a0d1433d900f7a838ba1f9310f914c3eb7ce9655bda6e4ab36e920f5

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for orjson-3.6.8-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 0c89b419914d3d1f65a1b0883f377abe42a6e44f6624ba1c63e8846cbfc2fa60
MD5 a5d481ba460d812c19b6fd18fbb7619d
BLAKE2b-256 9482bad9ed0ae9ab0cb616869864f78b10364529ad8bec273043ac378b55c367

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.6.8-cp39-cp39-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 afd9e329ebd3418cac3cd747769b1d52daa25fa672bbf414ab59f0e0881b32b9
MD5 77994312c209b58d7fad19d0dad065a6
BLAKE2b-256 7720cec8650f3da4e92a02d733604469f5bdc39938d717a3c3f180f26dcfac55

See more details on using hashes here.

File details

Details for the file orjson-3.6.8-cp39-cp39-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.6.8-cp39-cp39-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 32b6f26593a9eb606b40775826beb0dac152e3d224ea393688fced036045a821
MD5 ec4453e1bed8e9efbbc418b761e611fc
BLAKE2b-256 41ee51bbe228419c71567226585431770f7523a8b2bd154957e4324196af3a23

See more details on using hashes here.

File details

Details for the file orjson-3.6.8-cp39-cp39-manylinux_2_24_aarch64.whl.

File metadata

File hashes

Hashes for orjson-3.6.8-cp39-cp39-manylinux_2_24_aarch64.whl
Algorithm Hash digest
SHA256 6ab94701542d40b90903ecfc339333f458884979a01cb9268bc662cc67a5f6d8
MD5 fd6b826c58b5b4c1d69e2e20e5e14bba
BLAKE2b-256 51c602912a498785bdc57ecb450e42367e9b57720a6dab88078406b0d36b3ae3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.6.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2cbd358f3b3ad539a27e36900e8e7d172d0e1b72ad9dd7d69544dcbc0f067ee7
MD5 31d2f9a347e7351c66e7be50abfdff5c
BLAKE2b-256 e7216c17669a9fbe16ca5ccc46e97d7bb8e24817adbe8f9964042669f7baf902

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.6.8-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 137b539881c77866eba86ff6a11df910daf2eb9ab8f1acae62f879e83d7c38af
MD5 6ea9077e564b3b45a7a82ea955020d9a
BLAKE2b-256 6462337e4a4d5918a4be6d09feb5dee90e4af5543c45e3ae5a5a3f400971f853

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.6.8-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 81e1a6a2d67f15007dadacbf9ba5d3d79237e5e33786c028557fe5a2b72f1c9a
MD5 1a2581671745a74993430d1da162720f
BLAKE2b-256 b41fe30f384adbcd87c6742a5cdba45b7887abef5881b5f460300ae1ff261cf0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.6.8-cp39-cp39-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 83a8424e857ae1bf53530e88b4eb2f16ca2b489073b924e655f1575cacd7f52a
MD5 099caa5195a8de0c7312aa6ec366bbe6
BLAKE2b-256 09049fef72f7c36039f863b445a9541b5388d5bfb0590f4e22a4d89c01d015cc

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for orjson-3.6.8-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 c5a3e382194c838988ec128a26b08aa92044e5e055491cc4056142af0c1c54d7
MD5 00bdce40da0c4e90ef260b6f28b73d6d
BLAKE2b-256 de70c2ca8849d45b6e3dd362f820edda581e3524dd0884cc4905ac8962d39013

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.6.8-cp38-cp38-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 ea32015a5d8a4ce00d348a0de5dc7040e0ad58f970a8fcbb5713a1eac129e493
MD5 e023601ddb108396eafb80b8f856bf0c
BLAKE2b-256 655f086257a55c62e0baeefa7fd6a188b953cce7df49180328d1f31e8f61f9ea

See more details on using hashes here.

File details

Details for the file orjson-3.6.8-cp38-cp38-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.6.8-cp38-cp38-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 b07c780f7345ecf5901356dc21dee0669defc489c38ce7b9ab0f5e008cc0385c
MD5 8d2fb2c83305453d5a52c64d0dc705ac
BLAKE2b-256 294f0cfddeba64a3b21fdd2c2bd1f5aa2c5540cd9cdde1d11c89af86ee00ec68

See more details on using hashes here.

File details

Details for the file orjson-3.6.8-cp38-cp38-manylinux_2_24_aarch64.whl.

File metadata

File hashes

Hashes for orjson-3.6.8-cp38-cp38-manylinux_2_24_aarch64.whl
Algorithm Hash digest
SHA256 dd24f66b6697ee7424f7da575ec6cbffc8ede441114d53470949cda4d97c6e56
MD5 0b115abef99cae93f3b7de3724576aac
BLAKE2b-256 50185477aa347204ace2062e481bdd5da78d096eec92b906ce65302068c2ab7b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.6.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7be3be6153843e0f01351b1313a5ad4723595427680dac2dfff22a37e652ce02
MD5 612fb713a7495f80019c7169e7a59fea
BLAKE2b-256 4bc9352608d37ab1b73af839de3df9f210be3c328a39db103676632eb5e5241d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.6.8-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 656fbe15d9ef0733e740d9def78f4fdb4153102f4836ee774a05123499005931
MD5 f80bf877c996c11bc95de86c29a348ad
BLAKE2b-256 4d61f9d9b16eb0a18a4c8886121aea45e55478926e5e5d7db2cc1b3e6795730f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.6.8-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 90159ea8b9a5a2a98fa33dc7b421cfac4d2ae91ba5e1058f5909e7f059f6b467
MD5 d2e26963a4aa2db0caf978accd03b0b7
BLAKE2b-256 ce40d3c9128d5c35b2d30d7dc46f4e1a69c970c9dde217c912db2c4d4e564bf9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.6.8-cp38-cp38-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 33a82199fd42f6436f833e210ae5129c922a5c355629356ca7a8e82964da7285
MD5 a753050181baec01b500fac4372ec3cc
BLAKE2b-256 9c9dde7b7e7fa80731869f3a0a14959f95082e307a262bdaa1f5cf01ffc9025d

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for orjson-3.6.8-cp37-none-win_amd64.whl
Algorithm Hash digest
SHA256 9143ae2c52771525be9ad11a7a8cc8e7fd75391b107e7e644a9e0050496f6b4f
MD5 d08776f018ab6d2d022620a58965709f
BLAKE2b-256 76718d5de4bba8997e5ddcfa527201d63f38d9c8e4ed5916c97a900e4d0f81a2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.6.8-cp37-cp37m-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 b890dbbada2cbb26eb29bd43a848426f007f094bb0758df10dfe7a438e1cb4b4
MD5 cf0156b2cdf56af7f67245d050b46a88
BLAKE2b-256 4c1fdb760bb50e0eefd1706bb9d5ecac1dada2e878e96c04967ff4e629b9c03d

See more details on using hashes here.

File details

Details for the file orjson-3.6.8-cp37-cp37m-manylinux_2_24_x86_64.whl.

File metadata

File hashes

Hashes for orjson-3.6.8-cp37-cp37m-manylinux_2_24_x86_64.whl
Algorithm Hash digest
SHA256 a3dfec7950b90fb8d143743503ee53fa06b32e6068bdea792fc866284da3d71d
MD5 99953e88ce76e4fbdc6a76f79577e855
BLAKE2b-256 69da32c218a82623e46bf9f123ee83311745dd2844863db7ba4f159932dccb6f

See more details on using hashes here.

File details

Details for the file orjson-3.6.8-cp37-cp37m-manylinux_2_24_aarch64.whl.

File metadata

File hashes

Hashes for orjson-3.6.8-cp37-cp37m-manylinux_2_24_aarch64.whl
Algorithm Hash digest
SHA256 c311ec504414d22834d5b972a209619925b48263856a11a14d90230f9682d49c
MD5 629792d1ab6f4d22f121e3cecbcaf035
BLAKE2b-256 52a2566a15c3c406febcef062b9fc416d77e0ee8db31a629767dc1083e7492fa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.6.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9d2b5e4cba9e774ac011071d9d27760f97f4b8cd46003e971d122e712f971345
MD5 bef1233ceb83ee5f0cae65fe3b86a490
BLAKE2b-256 9c14670b2eaf23d50bd2ed3bdc5f9c8ccd7f9c060d937be1816fdd00b08e006b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.6.8-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 ab29c069c222248ce302a25855b4e1664f9436e8ae5a131fb0859daf31676d2b
MD5 eb31910f8554579de65eea7ea14ff526
BLAKE2b-256 0db10763d1643b145a2e6858244e59d39e3251dd42c5f1fe24a581e358ed7f7c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.6.8-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 ccb356a47ab1067cd3549847e9db1d279a63fe0482d315b3ffd6e7abef35ef77
MD5 3cd36bd214ee061f8679fb96f0835569
BLAKE2b-256 4b9d4bfa78774a324805302f279de1cdf40dd8d70b14b199a210da8112e1842e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for orjson-3.6.8-cp37-cp37m-macosx_10_7_x86_64.whl
Algorithm Hash digest
SHA256 1a5fe569310bc819279bd4d5f2c349910b104ed3207936246dd5d5e0b085e74a
MD5 2025b179f7515e4f5fca049af7bb9456
BLAKE2b-256 6d551f407ddfff3825f96ec636d2661460ccf46064da6cf625381baaa9503535

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